我有两个表,每个表都有以下id列:
Ticker
SEDOL,
ISIN
每行都有一个或多个填充了值的列。我想加入任何有价值的列。有谁知道如何以这种方式加入?感谢。
答案 0 :(得分:3)
Ticker
,SEDOL
和ISIN
都是不同的格式,所以我认为你需要
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