左连接排除匹配记录?
Left-join EXCLUDING matching records?
传统左连接 returns 从左边 table 开始的所有记录,包括匹配记录:
我想使用连接 排除 匹配记录,并且 return 仅从左侧排除不匹配的记录table:
下面显示的是我到目前为止想出的代码。
它使用 WHERE
子句来清除匹配记录 - 但不知何故感觉不对。
这是最好的方法吗?或者有什么更好的独占加入方式?
SELECT L.col1 ,
L.col2 ,
FROM leftTable L
LEFT JOIN rightTable R ON R.col1 = L.col1
WHERE R.id IS NULL ;
LEFT JOIN
方法可以。它在许多数据库中进行了优化。个人比较喜欢NOT EXISTS
,因为我觉得更简洁:
SELECT L.col1, L.col2
FROM leftTable L
WHERE NOT EXISTS (SELECT 1 FROM rightTable R WHERE R.col1 = L.col1);
也就是说,逻辑在一个地方(NOT EXISTS
表达式)而不是分散在两个查询子句中。
用Except
解释
Select * from table t LEFT JOIN
TABLE1 t1
On t.id=t1.id
Except
SELECT * FROM TABLE1
使用左连接方法没有错,事实上它是标准方法,在某些情况下大多数人都遵循这种方法来排除记录和增量插入
传统左连接 returns 从左边 table 开始的所有记录,包括匹配记录:
我想使用连接 排除 匹配记录,并且 return 仅从左侧排除不匹配的记录table:
下面显示的是我到目前为止想出的代码。
它使用 WHERE
子句来清除匹配记录 - 但不知何故感觉不对。
这是最好的方法吗?或者有什么更好的独占加入方式?
SELECT L.col1 ,
L.col2 ,
FROM leftTable L
LEFT JOIN rightTable R ON R.col1 = L.col1
WHERE R.id IS NULL ;
LEFT JOIN
方法可以。它在许多数据库中进行了优化。个人比较喜欢NOT EXISTS
,因为我觉得更简洁:
SELECT L.col1, L.col2
FROM leftTable L
WHERE NOT EXISTS (SELECT 1 FROM rightTable R WHERE R.col1 = L.col1);
也就是说,逻辑在一个地方(NOT EXISTS
表达式)而不是分散在两个查询子句中。
用Except
解释
Select * from table t LEFT JOIN
TABLE1 t1
On t.id=t1.id
Except
SELECT * FROM TABLE1
使用左连接方法没有错,事实上它是标准方法,在某些情况下大多数人都遵循这种方法来排除记录和增量插入