2014-01-30 62 views
0

我需要在比較兩個表中的數據後填充標誌列。 我有表A和B.SQL Server:比較兩個表並填充標誌列

表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 ,,,等..並且具有類似於ID1數據和ID2在表A

如果ID1或ID2從表A匹配的表b的各行中的任意值,然後把「Y」上的表B. 要求標誌列是非常簡單,但我不知道如何開始編碼。任何幫助你很感激。

回答

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); 
+0

感謝您的快速回復。你的查詢是有道理的,我沒有懷疑它,但無論如何,我們可以動態地獲取所有列並與id1進行比較,因爲表b有大約45列,並且不可能進行硬編碼。對不起,我應該提到這一點。 – sql84

+0

@sqlsean。 。 。你需要對它進行硬編碼。當您以非規範化的形式存儲數據時會發生這種情況。您可以使用'select_list_name from information_schema.columns where table_name ='tableA''獲取列的列表。 –

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;