SQL Server 加入任何已填充值的列
Posted
技术标签:
【中文标题】SQL Server 加入任何已填充值的列【英文标题】:SQL Server join on whichever column has value populated 【发布时间】:2013-08-11 21:45:24 【问题描述】:我有两个表,每个表都有以下 id 列:
Ticker
SEDOL,
ISIN
每一行都有一个或多个填充了值的列。我想加入任何具有价值的列。有谁知道如何加入这种方式?谢谢。
【问题讨论】:
你能分享更多关于你的桌子和你尝试过的信息吗? 【参考方案1】: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
【讨论】:
此解决方案有效,但性能不佳,因为这两个表都是 20,000 多条记录。 有没有办法只加入一个字段,如果它同时存在于表 T1 和 T2 中?这会加快速度吗? Martin - 感谢您的建议,但是上面的 union 和 intersect snippits 实际上比第一个帖子(常规加入)运行得慢。 您在表上有哪些索引?执行计划是什么样的?您为INTERSECT
查询获得什么连接类型?如果仍然嵌套循环,可以尝试INNER HASH JOIN
看看是否可以改善。【参考方案2】:
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
【讨论】:
【参考方案3】:您可以在 ON 部分使用 ISNULL 关键字。
Select *
From tab1
inner join tab2 on tab1.ColName = Isnull(Isnull(tab2.Ticker,tab2.SEDOL),tab2.ISIN)
在评论后添加:
假设您在一个表的一列中有一个值,而在另一列中有 3 个列,其中 2 个始终为空,并且一个列的值应与第一个表中的列匹配,则完成此查询。 ISNULL
用于从 3 个值中选择正确的值。
【讨论】:
SQL server有coalesce函数,基本上是isnull,但是可以带两个以上的参数 感谢您的建议,但不确定这将如何工作... tab1.ColName 是一个特定的列,例如 ISIN。它 tab2.col1 为空,我们使用 tab2.col2(比如 SEDOL)它永远不会匹配对吗? @user2584854 - 在帖子中添加了解释以上是关于SQL Server 加入任何已填充值的列的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel 更新 SQL Server 表,然后填充剩余的列数据