0

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

如果 Col1 的一行等于 Col3 中的任何行,则设置 Col2 等于 Col3 的行。否则,将其设置为等于 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
...
4

2 回答 2

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

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

于 2013-10-16T20:48:26.917 回答
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 设置为来自表 1 的 col3 或 col1 的第一个非空值,左外连接到表 2 中的不同值,因此当没有匹配时,col3 为空。

于 2013-10-16T20:48:55.720 回答