代码之家  ›  专栏  ›  技术社区  ›  Rich

查找具有相同字段的两个表之间未共享的SQL行

sql
  •  2
  • Rich  · 技术社区  · 14 年前

    |TableA|
    --------
    horse
    cat
    cow
    table
    
    |TableB|
    --------
    horse
    cat
    chair
    

    TableA 缺少 chair TableB 可能在另一个查询中 表B cow table 都不见了 .

    我的想法是对所有字段进行某种外部联接,然后对其中包含空值的行进行排序,但这似乎很繁重。是这条路走还是有更优雅/有效的方法?

    3 回复  |  直到 14 年前
        1
  •  12
  •   OMG Ponies    14 年前

    SELECT a.column
      FROM TABLE_A a
     WHERE a.column NOT IN (SELECT b.column
                              FROM TABLE_B b)
    

    使用不存在:

    SELECT a.column
      FROM TABLE_A a
     WHERE NOT EXISTS(SELECT NULL
                        FROM TABLE_B b
                       WHERE b.column = a.column)
    

    使用LEFT JOIN/IS NULL:

       SELECT a.column
         FROM TABLE_A a
    LEFT JOIN TABLE_B b ON b.column = a.column
        WHERE b.column IS NULL
    

    由于表别名的原因,您可以交换表名,而无需更改查询的其余部分,以查看相反的内容—表\u B中不在表\u A中的行。

        2
  •  0
  •   Guru    14 年前

    在为可为空的列使用IN子句时请注意

        3
  •  0
  •   RelativitySQL    6 年前

    如果要列出左表而非右表中的所有行以及右表而非左表中的所有行:

    CREATE TABLE test1 (
    idOne int identity primary key
    ,nameOne nvarchar (3) 
    )
    CREATE TABLE test2 (
    idTwo int identity primary key
    ,nameTwo nvarchar (3) 
    )
    INSERT INTO test1 (nameOne) VALUES
    ('one'),
    ('two'),
    ('thr')
    INSERT INTO test2 (nameTwo) VALUES
    ('one'),
    ('tre')
    
    SELECT 'test2 row', idOne, nameOne, idTwo, nameTwo FROM test1 t1
    RIGHT JOIN test2 t2 ON
    t1.idOne = t2.idTwo and 
    t1.nameOne = t2.nameTwo
    WHERE idONE is NULL
    OR idTwo is NULL
    UNION ALL 
    SELECT 'test1 row', idOne, nameOne, idTwo, nameTwo FROM test1 t1
    LEFT JOIN test2 t2 ON
    t1.idOne = t2.idTwo and 
    t1.nameOne = t2.nameTwo
    WHERE idOne is NULL
    OR idTwo is NULL