我有两张表record
和share
。 record
包含以下列:name
和id
。 share
列id
。
我想查找record
中但不存在于share
中的行。
我该怎么做?
答案 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不在第一个查询中的所有记录。