获取表A中的所有行,其中表B中不存在匹配的行

时间:2015-10-16 10:17:55

标签: sql sql-server sql-server-2008 join

道歉,我真的不确定要为这个标题添加什么,我认为它比听起来要复杂得多。此问题适用于Microsoft SQL Server 2008。

我有两个看起来像这样的表:

Logging.Logs:

+---------+------------+--------------+
|  LogID  |  LogEntry  |  LogTimeUtc  |
+---------+------------+--------------+
|  1      |  Foo       |  2015-10-16..|
|  2      |  Bar       |  2015-10-16..|
|  ...    |  ...       |  ...         |

Logging.LogAttributes:

+---------+------------------+----------------+
|  LogID  |  LogAttributeID  |  LogAttribute  |
+---------+------------------+----------------+
|  1      |  1               |  FooAttribute  |
|  1      |  2               |  BarAttribute  |
|  1      |  3               |  BazAttribute  |
|  2      |  1               |  FooAttribute  |
|  2      |  2               |  BazAttribute  |
|  ...    |  ...             |  ...           |

我希望来自Logging.Logs的所有LogID在Logging.LogAttributes中都没有相应的条目,LogAttribute字段以' Bar'开头。

在上面的表格中,我只得到LogID 2,因为LogID 1在LogAttributes中有一行' BarAttribute'在LogAttribute字段中。

我从左连接开始,但它返回1和2,因为LogAttributes中的条目LogID为1,而LogAttribute没有以' Bar'

开头
SELECT *
FROM Logging.Logs l
LEFT JOIN Logging.LogAttributes la
ON ( l.LogID = la.LogID AND la.LogAttribute NOT LIKE 'Bar%' )

4 个答案:

答案 0 :(得分:2)

您需要修改您的JOIN声明:

SELECT l.*
FROM Logging.Logs l
LEFT JOIN Logging.LogAttributes la ON l.LogID = la.LogID AND la.LogAttributeID LIKE 'Bar%'
WHERE la.LogID IS NULL

使用正确的索引,它应该 EXISTSIN查询更快。

SQL Fiddle

答案 1 :(得分:1)

你可以尝试:

SELECT *
FROM Logging.Logs l
WHERE NOT EXISTS 
     (SELECT * 
      FROM Logging.LogAttributes la 
      WHERE l.LogID = la.LogID AND la.LogAttribute LIKE 'Bar%' )

答案 2 :(得分:0)

你应该这样做:

SELECT *
FROM Logging.Logs L
WHERE L.LogID NOT IN (SELECT la.LogID 
                      FROM Logging.LogAttributes La
                      WHERE la.LogAttribute LIKE 'Bar%' )

答案 3 :(得分:0)

SELECT *
FROM Logging.Logs l Where l.LogId Not In ( Select la.LogId From Logging.LogAttributes la, Logging B Where 
la.LogID = B.LogID AND la.LogAttribute NOT LIKE 'Bar%' )

警告:NOT IN查询可能会导致大型数据集出现性能问题。

更新:NOT存在可能比NOT IN更好。