SQL Server加入任何具有填充值的列

时间:2013-08-09 20:54:22

标签: sql sql-server database join

我有两个表,每个表都有以下id列:

Ticker
SEDOL,
ISIN

每行都有一个或多个填充了值的列。我想加入任何有价值的列。有谁知道如何以这种方式加入?感谢。

3 个答案:

答案 0 :(得分:3)

TickerSEDOLISIN都是不同的格式,所以我认为你需要

SELECT *
FROM   T1
       JOIN T2
         ON T1.Ticker = T2.Ticker
             OR T1.SEDOL = T2.SEDOL
             OR T1.ISIN = T2.ISIN 

如果表格较大,性能会很差,请参阅Is having an 'OR' in an INNER JOIN condition a bad idea?

如果两个表在为特定安全性提供的列上是一致的,那么这可能会快得多,因为它可以使用散列或合并连接而不仅仅是嵌套循环。

SELECT *
FROM   T1
       INNER JOIN T2
         ON EXISTS (SELECT T1.Ticker,
                           T1.SEDOL,
                           T1.ISIN
                    INTERSECT
                    SELECT T2.Ticker,
                           T2.SEDOL,
                           T2.ISIN) 

或者如果表格不一致,则另一个选项可能是

SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.Ticker = T2.Ticker
UNION
SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.SEDOL = T2.SEDOL
UNION
SELECT *
FROM   T1
       INNER JOIN T2
         ON T1.ISIN = T2.ISIN 

答案 1 :(得分:0)

您可以在ON部分使用ISNULL关键字。

Select *
From tab1
inner join tab2 on tab1.ColName = Isnull(Isnull(tab2.Ticker,tab2.SEDOL),tab2.ISIN)

评论后添加: 假设您在一个表中的一列中具有值,并且在另一个表中有3列,其中总是2为空且一个具有应与第一个表中的列匹配的值,则完成此查询。 ISNULL用于从3个值中选择正确的值。

答案 2 :(得分:0)

select *
from T1
    inner join T2 on T2.Ticker = coalesce(T1.Ticker, T1.SEDOL, T1.ISIN)

但如果T1中的值可能不为空,但T2没有相应的值,则可以

select *
from T1
    outer apply
    (
        select top 1 T2.Col
        from T2
        where T2.Ticker in (T1.Ticker, T1.SEDOL, T1.ISIN)
        order by
             case
                 when T2.Ticker = T1.Ticker then 0
                 when T2.Ticker = T1.SEDOL then 1
                 when T2.Ticker = T1.ISIN then 2
             end
    )

或者你可以做

select *, coalesce(T21.Col, T22.Col, T23.Col) as T2_Col
from T1
    left outer join T21 on T21.Ticker = T1.Ticker
    left outer join T22 on T22.Ticker = T1.SEDOL
    left outer join T23 on T23.Ticker = T1.ISIN