如何使用sql join,其中table1具有table2中不存在的行

时间:2010-11-28 11:13:07

标签: sql join

我有两张表recordsharerecord包含以下列:nameidshareid

我想查找record中但不存在于share中的行。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

SQL LEFT JOIN返回左表中的所有行,即使右表中没有匹配项

SELECT name, id
FROM record r LEFT JOIN share s on r.id = s.id
WHERE s.id is null

答案 1 :(得分:2)

你有这个表: 记录(ID,NAME) SHARE(ID,VALUE)

如果您的SQL引擎支持LEFT OUTER JOINS,最好的方法是:

SELECT RECORD.* FROM RECORD LEFT OUTER JOIN SHARE WHERE RECORD.ID=SHARE.ID
WHERE SHARE.ID IS NULL

重要
在SHARE.ID上放置一个索引

工作原理:
SQL引擎遍历所有RECORD表,在SHARE中查找记录,如果在SHARE中找到“链接”记录,则其中的子句为falso,因此记录不包括在结果集中,如果没有记录在share中找到where子句为true且RECORD。*包含在结果集中。这要归功于LEFT OUTER JOIN。

注意:
另一种做同样事情的方法是使用WHERE RECORD.ID NOT IN(SELECT ID FROM SHARE)。 请注意,根据您使用的sql引擎,这可能会导致严重的性能问题,因为内部引擎可以在RECORD表中的每个记录运行一次(SELECT ID FROM SHARE)。

答案 2 :(得分:1)

从t1中选择Id,其中id不在(从t2中选择id)

答案 3 :(得分:0)

来自RECORD的SELECT *,其中ID不在(SELECT DISTINCT ID FROM SHARE);

  

SELECT DISTINCT ID FROM SHARE - 将获得表共享中的所有不同ID

     
    

来自RECORD的SELECT *,其中ID不在(SELECT DISTINCT ID FROM SHARE); 将显示ID不在第一个查询中的所有记录。