我在数据库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
...
答案 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。