0

两张桌子

tblEatables 和 tblConfirm_Eatables

餐桌

斯诺名称  
1 苹果
2个橙子
3 木瓜
4 菠萝蜜
5 菠萝
6芒果

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 

为什么尽管我使用了<>,但下面的查询会带来所有可食用的食物

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

OP

姓名
苹果
菠萝蜜
芒果
橘子
番木瓜
菠萝
4

3 回答 3

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

要更好地理解其工作原理,请参阅此链接以获得在 SQL 中使用联接的良好视觉指南;特别是第四个,我们使用LEFT JOIN/IS NULL技术检索表 A 中与表 B 中不匹配的所有记录。

于 2012-07-26T08:09:46.843 回答
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 
于 2012-07-26T08:08:10.467 回答
0

你应该在子句中使用这个E.Sno != CE.Eatbles_Id条件。WHERE

在连接中使用!=运算符会给您带来意想不到的结果。

于 2012-07-26T08:02:39.657 回答