2013-10-16 126 views
0

我在數據庫DB1中有兩個來自Table1的列Col1,Col2。 Col1包含數據,Col2全爲空。我有一個Col3列,它來自另一個數據庫DB2中Table2上的查詢。我想根據以下條件設置Col2 -需要循環或迭代結果集

如果一行Col1等於Col3中的任何行,則將Col2 EQUAL TO設置爲等於Col3的行。 ELSE,將其設置爲等於Col1。它很奇怪,但我需要去做。

示例 -

COL3總是= {AAA,RTY,CCC,DART,汽車,魚,SPOON}

Col1,Col2,Col3 
Aaa, null, Aaa 
Bbb, null, RTY 
Ccc, null, Ccc 
... 

如何進行查詢,這將給我們下面的結果呢?

Col1,Col2,Col3 
Aaa, Aaa, Aaa 
Bbb, Bbb, RTY 
Ccc, Ccc, Ccc 
... 

回答

1

假設你要選擇,而不是更新 - 這是最明顯的解決方案將是分裂的問題納入其各個位:

替換爲EXY您Col1中,col2的,COL3視圖/表/別名。

;WITH exy(Col1, Col2, Col3) AS (SELECT 'Aaa', null, 'Aaa' union SELECT 'Bbb', null, 'RTY' union SELECT 'Ccc', null, 'Ccc') 
SELECT a.Col1, a.Col3 AS Col2, a.Col3 FROM exy AS a WHERE EXISTS (SELECT 1 FROM exy WHERE Col3 = a.Col3) 
UNION 
SELECT a.Col1, a.Col1 AS Col2, a.Col3 FROM exy AS a WHERE NOT EXISTS (SELECT 1 FROM exy WHERE Col3 = a.Col3) 

然後你就可以簡化下來一點:

;WITH exy(Col1, Col2, Col3) AS (SELECT 'Aaa', null, 'Aaa' union SELECT 'Bbb', null, 'RTY' union SELECT 'Ccc', null, 'Ccc') 
SELECT a.Col1, CASE WHEN 1 = EXISTS(SELECT 1 FROM exy WHERE Col3=a.Col3) THEN a.Col3 ELSE a.Col1 END AS Col2, a.Col3 FROM exy 

有可能是一個更好的解決方案,但我們需要看到您的原始表格和了解你的問題。這也可以通過連接完成。但是,在性能方面往往有利於清晰度。當考慮到績效時,在優化過早之前,您必須知道您的目標是什麼。

0

這可以適合您的情況嗎?

update t1 
set col2 = coalesce(a.col3,a.col1) 
    from database1.dbo.table1 as t1 inner join (
     select t1.col1 
      , t2.col3 
     from database1.dbo.table1 t1 
      left outer join (
       select distinct col3 
       from database2.dbo.table2 
          ) as t2 on t1.col1 = t2.col3 
      ) as a on t1.col1 = a.col1 

集COL2從任一COL3或COL1從表1中的第一非空值左外側表2接合到不同的值,因此,當不存在匹配,COL3爲空。