我有两个表,都有多个ID,没有一个是主要的。
如果table2中存在匹配项,我想首先在table1上将table2连接到table1。如果给定记录不存在匹配,则匹配ID2;最后,如果ID2上不存在匹配,则匹配ID3。
我开始使用类似于以下内容的CASE语句进行设置:
select *
from table1 t
inner join table2 s
on CASE
WHEN s.ID1 = t.ID1 THEN s.ID1 = t.ID1
WHEN s.ID2 = t.ID2 THEN s.ID2 = t.ID2
ELSE s.ID3 = t.ID3
END
但SQL Server似乎不喜欢它。
关于如何设置这样的东西的任何想法?
答案 0 :(得分:0)
尝试在=的每一侧分开单独的案例,如下所示:
select *
from table1 t
inner join table2 s
on
CASE
WHEN s.ID1 = t.ID1 then s.ID1
WHEN s.ID2 = t.ID2 THEN s.ID2
ELSE s.ID3
END =
CASE
WHEN s.ID1 = t.ID1 then t.ID1
WHEN s.ID2 = t.ID2 THEN t.ID2
ELSE t.ID3
END
虽然这可能效果不佳,但应该有效。
答案 1 :(得分:0)
declare @table1 table (ID1 int, ID2 int, ID3 int)
declare @table2 table (ID1 int, ID2 int, ID3 int)
insert into @table1 values (1, 2, 3)
insert into @table2 values (1, 1, 1)
insert into @table2 values (1, 2, 2)
insert into @table2 values (2, 2, 2)
insert into @table2 values (3, 3, 3)
select *
from @table1 t
cross apply (select top 1 with ties *
from @table2 t2
where t2.ID1 = t.ID1 or
t2.ID2 = t.ID2 or
t2.ID3 = t.ID3
order by case
when t2.ID1 = t.ID1 then 1
when t2.ID2 = t.ID2 then 2
when t2.ID3 = t.ID3 then 3
end) as S
结果:
ID1 ID2 ID3 ID1 ID2 ID3
----------- ----------- ----------- ----------- ----------- -----------
1 2 3 1 1 1
1 2 3 1 2 2
答案 2 :(得分:0)
连接需要布尔结果。你只需要一个比较运算符。试试
inner join table t on
CASE
WHEN s.ID1 = t.ID1 THEN 1
WHEN s.ID2 = t.ID2 THEN 1
WHEN s.ID3 = t.ID3 THEN 1
ELSE 0
END = 1
答案 3 :(得分:0)
使用3个连接和一些UNION可能会获得更好的性能,类似于:
select *
from table1 t
inner join table2 s
ON s.ID1 = t.ID1
UNION
select *
from table1 t
inner join table2 s
ON s.ID1 != t.ID1 AND s.ID2 = t.ID2
UNION
select *
from table1 t
inner join table2 s
ON s.ID1 != t.ID1 AND s.ID2 != t.ID2 AND s.ID3 == t.ID3