【发布时间】:2013-08-11 21:45:24
【问题描述】:
我有两个表,每个表都有以下 id 列:
Ticker
SEDOL,
ISIN
每一行都有一个或多个填充了值的列。我想加入任何具有价值的列。有谁知道如何加入这种方式?谢谢。
【问题讨论】:
-
你能分享更多关于你的桌子和你尝试过的信息吗?
标签: sql sql-server database join
我有两个表,每个表都有以下 id 列:
Ticker
SEDOL,
ISIN
每一行都有一个或多个填充了值的列。我想加入任何具有价值的列。有谁知道如何加入这种方式?谢谢。
【问题讨论】:
标签: sql sql-server database join
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
【讨论】:
INTERSECT 查询获得什么连接类型?如果仍然嵌套循环,可以尝试INNER HASH JOIN 看看是否可以改善。
select *
from T1
inner join T2 on T2.Ticker = coalesce(T1.Ticker, T1.SEDOL, T1.ISIN)
但如果T1中的值可能不为null,但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
【讨论】:
您可以在 ON 部分使用 ISNULL 关键字。
Select *
From tab1
inner join tab2 on tab1.ColName = Isnull(Isnull(tab2.Ticker,tab2.SEDOL),tab2.ISIN)
在评论后添加:
假设您在一个表的一列中有一个值,而在另一列中有 3 个列,其中 2 个始终为空,并且一个列的值应与第一个表中的列匹配,则完成此查询。 ISNULL 用于从 3 个值中选择正确的值。
【讨论】: