代码之家  ›  专栏  ›  技术社区  ›  Jay.

合并除第一个表中存在的行以外的两个表

  •  -3
  • Jay.  · 技术社区  · 3 年前

    我有以下两张表:

    表A:

    id, name
    1, 'John'
    

    表B:

    id, name
    1, 'Doe',
    2, 'Name 1'
    

    我想从表A中选择所有行,然后 仅 表B中表A中不存在“id”值的那些行。

    所以从上面的数据我应该得到

    1, 'John'
    2, 'Name 1'
    

    我怎么能拿到? 我正在尝试使用 EXCEPT 以及何处 NOT IN 条件如下,但我有错误。

    select * from TableA a
    union 
    select * from TableB b
    except (select * from TableB where TableB.id NOT IN TableA.id) 
    order by id
    
    
    select * from TableA a
    union 
    select * from TableB b
    WHERE b.Id  NOT in (select * from TableA where TableA.id = b.id) 
    order by id
    
    2 回复  |  直到 3 年前
        1
  •  3
  •   Patrick Hurst    3 年前

    你没有使用正确的语法。 EXCEPT 需要一个匹配的数据集(很像UNION)。 NOT IN 需要一个具有单列的集合。 此外,您还可以使用 LEFT OUTER JOIN 方法

    值得指出的是 除外 应用于的产品 UNION .

    DECLARE @TableA TABLE (ID INT, Name VARCHAR(10));
    INSERT INTO @TableA (ID, Name) VALUES (1, 'John');
    DECLARE @TableB TABLE (ID INT, Name VARCHAR(10));
    INSERT INTO @TableB (ID, Name) VALUES (1, 'Doe'), (2, 'Name 1');
    
    SELECT a.ID, a.Name
      FROM @TableA a
    UNION ALL
    SELECT b.ID, b.Name
      FROM @TableB b
        LEFT OUTER JOIN @TableA a
          ON b.ID = a.ID
     WHERE a.ID IS NULL
    
    SELECT a.ID, a.Name
      FROM @TableA a
    UNION ALL
    SELECT b.ID, b.Name
      FROM @TableB b
     WHERE b.ID NOT IN (SELECT ID FROM @TableA)
    
     SELECT a.ID, a.Name
      FROM @TableA a
    UNION ALL
    SELECT b.ID, b.Name
      FROM @TableB b
     EXCEPT (SELECT ID, Name FROM @TableA)
    
        2
  •  2
  •   nbk    3 年前

    你可以用A FULL OUTER JOIN

    SELECT
    COALESCE(A.[id],B.[id]) id, COALESCE(A.[name],B.[name]) name
    FROM TableA A FULL OUTER JOIN TableB B ON A.id = b.id
    
    身份证件 名称
    1. “约翰”
    2. '名称_1'

    fiddle

        3
  •  0
  •   Sohail Aslam    3 年前
    SELECT id, name FROM TableA UNION SELECT B.id, B.name FROM TableB B LEFT JOIN TableA A ON B.id = A.id WHERE A.id IS NULL;