SQL Query查找两个相关表之间缺少的行

Faz*_*zal 29 sql database oracle

我有两张桌子:

表A.

  • ID
  • ABC_ID
  • VAL

表B.

  • ID
  • ABC_ID
  • VAL

这两个表通过ABC_ID列直接相互关联.

我想找到VAL表A中的所有列值,这些列值在表B中存在于相同的ABC_ID.

Lar*_*tig 50

SELECT A.ABC_ID, A.VAL WHERE NOT EXISTS 
   (SELECT * FROM B WHERE B.ABC_ID = A.ABC_ID AND B.VAL = A.VAL)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT A.ABC_ID, A.VAL WHERE VAL NOT IN 
    (SELECT VAL FROM B WHERE B.ABC_ID = A.ABC_ID)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT A.ABC_ID, A.VAL LEFT OUTER JOIN B 
    ON A.ABC_ID = B.ABC_ID AND A.VAL = B.VAL WHERE B.VAL IS NULL
Run Code Online (Sandbox Code Playgroud)

请注意,这些查询根本不要求ABC_ID在表B中.我认为那样做你想要的.

  • 如果 TableB 有多于一条匹配 ABC_ID 和 VAL 的记录,则连接将产生记录相乘的副作用 (2认同)
  • Remus,JOIN过滤掉匹配的行,因此只有表A中未匹配的表A将对结果集有贡献.因为将显示的行仅来自JOIN的表A侧(通过LEFT OUTER),我认为每行仅显示一次. (2认同)
  • @alphaprolix:我不知道这个想法从哪里开始,但在这种情况下你不需要避免*.对于查询优化器来说,显而易见的是,您正在检查是否存在行,而不是返回数据,并且不会使用列列表. (2认同)