2012-07-26 274 views
0

兩個表MySQL查詢內部聯接

tblEatables和tblConfirm_Eatables

tblEatables

 
Sno  Name 
1  Apples 
2  Oranges 
3  Papaya 
4  Jackfruit 
5  Pineapple 
6  Mango 

tblConfirm_Eatables

 
Eatbles_Id Confirm_Status 
    1    0 
    2    1 
    3    0 
    4    0 

問題1

爲什麼下面的查詢就會重複記錄集

SELECT E.Name   
FROM Eatables E INNER JOIN 
Confirm_Eatables CE ON CE.Eatbles_Id != E.Sno 

爲什麼下面的查詢從雖然我使用的表將所有eatbles <>

SELECT E.Name   
FROM Eatables E INNER JOIN 
     Confirm_Eatables CE ON E.Sno != CE.Eatbles_Id 
GROUP BY E.Name 

OP

 
Name 
Apples 
Jackfruit 
Mango 
Oranges 
Papaya 
Pineapple 
+0

你想實現什麼? – bugwheels94 2012-07-26 08:01:15

+1

複製發生是因爲Sno(2,3,4,5,6)不等於eatables_id(1),sno(1,3,4,5,6)不等於eatables_id(2)等。這會回答這兩個問題。 – 2012-07-26 08:02:56

+0

你是否有機會想找出在confirm_eatables表中找不到的食物? – 2012-07-26 08:04:49

回答

0

你應該使用E.Sno != CE.Eatbles_Id條件WHERE條款。

使用!=運算符在加入會給你意想不到的結果。

+0

在where子句中使用它們也會導致意想不到的結果 – bugwheels94 2012-07-26 08:03:43

1

有不同的很好的例子JOIN的上頁 http://www.sql-tutorial.ru/en/book_explicit_join_operations/page1.html

的頂端爲我更好地使用=在連接查詢和之後使用時除外。在用自己的方式:

SELECT E.Name FROM Eatables 
       EXCEPT ALL 
    SELECT E.Name FROM Eatables E INNER JOIN 
     Confirm_Eatables CE ON CE.Eatbles_Id = E.Sno 
+0

我認爲你的意思是「EXCEPT」,而不是「RESTRICT」。即使使用「EXCEPT」,它也不會工作,因爲MySQL不支持該特定關鍵字。 – 2012-07-26 08:21:13

+0

除了確定,和「=」而不是「==」。 :-) – msi77 2012-07-26 09:34:39

+0

yes =))現在會改變 – kisileno 2012-07-26 15:50:16

1

我想你想要的是:

SELECT a.Name 
FROM tblEatables a 
LEFT JOIN tblConfirm_Eatables b ON a.Sno = b.Eatables_Id 
WHERE b.Eatables_Id IS NULL 

這將讓所有行tblEatables不在tblConfirm_Eatables

爲了更好地理解它是如何工作的,請參閱this link以獲得在SQL中使用連接的良好視覺指南;特別是第四個下降,我們使用LEFT JOIN/IS NULL技術檢索表A中表B中沒有匹配的所有記錄。