我有以下SQL语句:
SELECT a.Data ,
a.DataID ,
b.ParentDataID
FROM table1 a
LEFT OUTER JOIN table2 b ON a.DataID = b.ID
例如,结果集的第一行看起来像"a.DataID = 1, a.Data = Cat, b.ParentDataID = 0";在结果集的下一行中,"a.DataID=2, a.Data = Dog, b.ParentDataID = 1"。
我正在尝试做的是显示名为"PreviousData"的第 4 列,或者当 b.ParentDataID = 0 时它将是一个空字符串,但如果 b.ParentDataID 的值等于某个 DataID(在本例中为 1),那么它看起来像:
a.DataID=2, a.Data = Dog, b.ParentDataID = 1, PreviousData = Cat
如果可能的话,我将如何去做?
您要查找的是自连接和 CTE(公用表表达式)
With MyView As (
SELECT
a.Data ,
a.DataID ,
b.ParentDataID
FROM table1 a
LEFT OUTER JOIN table2 b ON a.DataID = b.ID
)
SELECT a.DataID,
a.Data,
b.ParentDataId,
Parent.Data
From MyView
as Parent
LEFT Join MyView as Child on Parent.DataId = Child.ParentDataId
注意:可能存在一些语法错误,因为我没有SQL管理工作室。
使用 LEAD 和 LAG,下面是一个示例:
SELECT
LAG(p.FirstName) OVER (ORDER BY p.BusinessEntityID) PreviousValue,
p.FirstName,
LEAD(p.FirstName) OVER (ORDER BY p.BusinessEntityID) NextValue
FROM Person.Person p
源:http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/
使用 LAG 函数:
select dataid, data , lag(dataid,1,0) over (order by dataid) as parentdataid,
lag(data,1,0) over (over by dataid) as parentdata
from table