2015-02-23 63 views
0

我有兩個互連的表:一個存儲一些通用結果(表1),另一個存儲每個結果(表2)的N行。 table2中的每條記錄都有一個記錄table1行引用(字段名爲「ref_id」)的「auto_id」的字段根據另一個表的結果衝出表

我故意刪除了table1中的一些記錄,但我在table2中留下了引用的行。

如何查找表2中無效的「ref_id」行,鏈接到table1中不存在的「auto_id」?

我想這樣

SELECT * 
FROM table2 
WHERE NOT EXISTS(
    SELECT auto_id 
    FROM 'table1' 
    WHERE 'table2.res_id' = auto_id 
) 

,但顯然有-S的一些錯誤。 感謝您的幫助!

+0

「正確」的解決方案是通過設置[外鍵](http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-foreign-keys。 html),這樣數據庫將自動刪除依賴記錄或防止由於依賴記錄的存在而導致的刪除。但是,MySQL只在InnoDB表上強制執行外鍵。 – 2015-02-23 09:52:06

回答

1

您正在使用錯誤的引號。單引號(撇號或ASCII 39)用於文字字符串。最簡單的解決方案是刪除引號:

SELECT * 
    FROM table2 
    WHERE NOT EXISTS(
     SELECT auto_id 
     FROM table1 
     WHERE table2.res_id = auto_id 
    ); 

如果要引用MySQL中的標識符,請使用反引號(ASCII 96)。

SELECT * 
    FROM `table2` 
    WHERE NOT EXISTS(
     SELECT auto_id 
     FROM `table1` 
     WHERE `table2`.`res_id` = `auto_id` 
    ); 
+0

修復它。謝謝! – CaptainPhlegm 2015-02-23 09:58:46

0

MySQL JOIN是您的最佳選擇。 試試這個:

SELECT * 
FROM table2 T2 
JOIN table1 T1 
ON T2.`res_id` != T1.`auto_id` 
+0

'!='與'WHERE NOT EXISTS'子查詢有很大區別。 – 2015-02-23 10:19:28

1

最清晰的方式恕我直言,是一個外連接過濾失蹤行:

SELECT t2.* 
FROM table2 
LEFT JOIN table1 t1 ON t1.auto_id = t2.res_id 
WHERE t1.auto_id IS NULL 

這工作,因爲錯過了左聯接在其列中的所有空值和where子句條件適用之後加入 - IS NULL條件意味着返回的唯一行是那些不在在另一個表中具有匹配的行。

除了效率最高(假設索引號爲table1.auto_id)之外,它還提供比NOT IN (...)查詢更簡短的查詢。

相關問題