36

到目前为止,我似乎无法弄清楚这一点。我正在尝试连接两个表,并且只选择表 A 中在表 B 中没有匹配列的行。例如,假设我们有一个 users 表和一个 sent 表。

users表具有以下列:id, username
sent表具有以下列:id, username

我想选择表usersusername不存在的所有行sent。因此,如果tom是 inusers和 in,sent他将不会被选中。如果他在users但没有在,sent他将被选中。我试过这个,但它根本没有用:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname
4

3 回答 3

62

通常,您会使用NOT EXISTS这种类型的查询

SELECT p.Name
FROM   pooltest p
WHERE  NOT EXISTS (SELECT s.Name
                   FROM   senttest s
                   WHERE  s.Name = p.Name)

另一种方法是使用 aLEFT OUTER JOIN并检查NULL

SELECT p.Name
FROM   pooltest p
       LEFT OUTER JOIN senttest s ON s.Name = p.Name
WHERE  s.Name IS NULL

请注意,您使用的隐式连接语法被认为是过时的,应替换为显式连接。

于 2012-06-10T12:47:25.810 回答
26

试试这个 SQL:

SELECT users.username
FROM  users
LEFT JOIN sent ON sent.username = users.username
WHERE sent.username IS NULL;

我认为更好的方法是:

SELECT users.username
FROM  users
LEFT JOIN sent ON sent.id = users.id
WHERE sent.id IS NULL;

由于两个 id 字段都将被编入索引(我会认为是主键),因此该查询将比我建议的第一个查询更好地优化。

但是,您可能会发现我的第一个建议对您更好,这取决于您对应用程序的要求。

于 2012-06-10T12:52:59.617 回答
-3

也许这个可以帮助你....

我也有同样的问题,但使用这个查询解决了

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1);

希望这个能解决你的问题

于 2015-08-11T10:34:47.747 回答