在ID上使用优先逻辑连接表的任何方法?

时间:2011-07-22 22:33:31

标签: sql sql-server

我有两个表,都有多个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似乎不喜欢它。

关于如何设置这样的东西的任何想法?

4 个答案:

答案 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