SQL Server语言 - 从 select 语句中的前几行获取数据



我有以下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

最新更新