需要循环或迭代结果集

时间:2013-10-16 20:35:36

标签: sql sql-server sql-server-2008

我在数据库DB1中有来自Table1的两列Col1,Col2。 Col1包含数据,Col2全部为空。我有一个列Col3,来自另一个数据库DB2中Table2的查询。我想根据以下条件设置Col2 -

如果Col1的一行与Col3中的任何行相等,则将Col2 EQUAL设置为Col3的行。 ELSE,将它设置为等于Col1。它很奇怪,但我需要这样做。

示例 -

Col3总是= {Aaa,RTY,Ccc,DART,Car,Fish,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
...

2 个答案:

答案 0 :(得分: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

可能有更好的解决方案,但我们需要查看原始表并了解您的问题。这也可以通过连接完成。但是,明显优于性能通常是有益的。当涉及到性能时,您必须在过早优化之前知道目标是什么。

答案 1 :(得分: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为null。