MySQL查询内部联接

问题描述:

两个表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

你应该使用E.Sno != CE.Eatbles_Id条件WHERE条款。

使用!=运算符在加入会给你意想不到的结果。

+0

在where子句中使用它们也会导致意想不到的结果 – bugwheels94 2012-07-26 08:03:43

有不同的很好的例子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

我想你想要的是:

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中没有匹配的所有记录。