有一个包含此格式的表格:
HistoryDataTbl:
Id, LookupId, PreviousValueReferenceId, CurrentValueReferenceId, UpdatedDate
ReferenceDataTbl:
Id, Value
ReferenceData示例:
Id Value
1, ValueA
2, ValueB
3, ValueC
4, ValueD
HistoryDataTbl示例:
Id PreviousValueId CurrentValueId UpdatedDate
1 1 1 '2017-01-10 14:38:51.110'
2 3 2 '2017-02-10 14:38:51.110'
3 1 4 '2017-03-10 14:38:51.110'
4 2 3 '2017-04-10 14:38:51.110'
HistoryDataTbl在ReferenceDataTbl中有多个指向值的行。 如何在加入ReferenceDataTbl时在每行显示PreviousValue和CurrentValue?
select UpdatedDate
,(select top 1 [value] from ReferenceData where id =
hd.PreviousValueReferenceId) as PreviousValue
,(select top 1 [value] from ReferenceData where id =
hd.CurrentValueReferenceId) as CurrentValue
FROM HistoryData hdt
order by UpdatedDate
非常确定我尝试使用的模式是错误的,因为我必须做前1,因为" Subquery返回的值超过1"。这里需要应用什么模式?
更新了帖子,因为在尝试发布的解决方案后,它现在返回4行,而只有2个HistoryDataTbl。这只需要返回2个条目。
作为重复的链接线程并没有像这个帖子那样帮助我,所以不要接受它。
感谢阅读。
答案 0 :(得分:1)
简单 - 您只需要两次加入参考表 - 每个值一次:
SELECT H.ID,
H.LookupID,
Prev.Value AS [Previous Value],
Curr.Value AS [Current Value],
H.UpdatedDate
FROM HistoryDataTbl H
JOIN ReferenceDataTable Prev
ON H.PreviousValueReferenceID = Prev.ID
JOIN ReferenceDataTbl Curr
ON H.CurrentValueReferenceID = Curr.ID
编辑:
你说你只想要一行 - 你可以用CROSS APPLY
实现这一点:
SELECT H.ID,
H.LookupID,
Prev.Value AS [Previous Value],
Curr.Value AS [Current Value],
H.UpdatedDate
FROM HistoryDataTbl H
CROSS APPLY
(
SELECT [Value]
FROM ReferenceDataTable R
WHERE R.ID = H.PreviousValueReferenceID
) Prev
CROSS APPLY
(
SELECT [Value]
FROM ReferenceDataTable R2
WHERE R2.ID = H.CurrentValueReferenceID
) Curr