1

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

Ticker
SEDOL,
ISIN

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

4

3 回答 3

3

TickerSEDOL并且ISIN都是不同的格式,所以我认为您需要

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

但是,如果表很大,性能会很差,请参阅在 INNER JOIN 条件中使用“或”是一个坏主意吗?.

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

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 
于 2013-08-09T21:03:48.053 回答
0

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

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

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

于 2013-08-09T21:07:27.427 回答
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
于 2013-08-09T21:26:17.880 回答