SQL Server:比较两个表并填充标志列

时间:2014-01-30 03:50:22

标签: sql sql-server

我需要在比较两个表中的数据后填充flag列。 我有表A和表B.

表A:

NAME----PHONE-----ID1---------ID2   
MAT------123456-----0.123-----2.123
NICK-----234672----123-------234
SAM-----111111-----456------987
  

表B列是   ID_A,ID_B,ID_C,ID_D ,,,依此类推...并且数据类似于表A中的ID1和ID2

如果表A中的ID1或ID2与表b中相应行的任何值匹配,则将'Y'放在表B的标志列上。 要求非常直接,但我不知道如何开始编码。非常感谢。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用case语句和exists条款执行此操作:

select b.*,
       (case when exists (select 1
                          from tableA a
                          where a.id1 in (b.id_a, b.id_b, b.id_c, b.id_d) or
                                a.id2 in (b.id_a, b.id_b, b.id_c, b.id_d)
                         )
             then 'Y'
             else 'N'
        end) as flag
from tableB b;

编辑:

如果您确实想要更新:

update b
    set flag = (case when exists (select 1
                                  from tableA a
                                  where a.id1 in (b.id_a, b.id_b, b.id_c, b.id_d) or
                                        a.id2 in (b.id_a, b.id_b, b.id_c, b.id_d)
                                 )
                     then 'Y'
                     else 'N'
                end);

答案 1 :(得分:0)

试试这个:

UPDATE  b
SET     Flag = CASE WHEN EXISTS 
        (
            SELECT x.ID FROM 
            (
                SELECT b.ID_A UNION ALL 
                SELECT b.ID_B UNION ALL 
                SELECT b.ID_C UNION ALL 
                SELECT b.ID_D UNION ALL 
                SELECT b.ID_E
            ) x(ID) WHERE x.ID IS NOT NULL
            INTERSECT
            SELECT y.ID FROM dbo.TableA a CROSS APPLY 
            (
                SELECT a.ID1 
                UNION ALL 
                SELECT a.ID2
            ) y(ID) WHERE y.ID IS NOT NULL
        ) THEN 'Y' ELSE 'N' END
FROM    dbo.TableB b;