我有两个看起来像这样的表:
+---------+------------+--------------+
| LogID | LogEntry | LogTimeUtc |
+---------+------------+--------------+
| 1 | Foo | 2015-10-16..|
| 2 | Bar | 2015-10-16..|
| ... | ... | ... |
+---------+------------------+----------------+
| 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%' )
答案 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
使用正确的索引,它应该 比EXISTS
和IN
查询更快。
答案 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更好。