SQL中的这种模式是什么

时间:2017-07-21 17:51:14

标签: sql-server

有一个包含此格式的表格:

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个条目。

作为重复的链接线程并没有像这个帖子那样帮助我,所以不要接受它。

感谢阅读。

1 个答案:

答案 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