2013-10-16 128 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为空。