Sql server SQL Server 2008是否可以有Select Top返回空值

Sql server SQL Server 2008是否可以有Select Top返回空值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,上面的代码是我目前正在使用的(它不是最佳的,但只用于一次性数据导出) 在我们当前从中导出的数据库中,有一个PatientVisitDiags表,其中包含列“ListOrder”和“Code”。可以有1到5个代码。ListOrder保存该代码的编号。例如: (Select top 1 pvd.Code from PatientVisitDiags pvd where pvd.PatientVisitId = pv.PatientVisitId Order By pvd.Listor

上面的代码是我目前正在使用的(它不是最佳的,但只用于一次性数据导出)

在我们当前从中导出的数据库中,有一个PatientVisitDiags表,其中包含列“ListOrder”和“Code”。可以有1到5个代码。ListOrder保存该代码的编号。例如:

(Select top 1 pvd.Code from PatientVisitDiags pvd
    where pvd.PatientVisitId = pv.PatientVisitId
    Order By pvd.Listorder) as "DX1",
(Select top 1 a.code from (Select top 2 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
    where pvd.PatientVisitId = pv.PatientVisitId
    Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX2",
(Select top 1 a.code from (Select top 3 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
    where pvd.PatientVisitId = pv.PatientVisitId
    Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX3",
(Select top 1 a.code from (Select top 4 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
    where pvd.PatientVisitId = pv.PatientVisitId
    Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX4",
(Select top 1 a.code from (Select top 5 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
    where pvd.PatientVisitId = pv.PatientVisitId
    Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX5"
我正在尝试将代码导出到新表中相应的列(DX1、DX2..等)。如果我按列表顺序排序,我可以按我需要的顺序(第1行到DX1 |第2行到DX2等)得到它们。但是,当我运行上述SQL代码时,如果源表只有3个代码,DX4和DX5将重复DX3。例如:

ListOrder|Code   |
1        |M51.27 |
2        |M54.17 |
3        |G83.4  |
如果选择的TOP多于给定值,是否有方法使TOP返回空值?SQLServer2008不允许偏移/提取,这是我通常会做的,因为我可以选择单独的行

TL:DR

DX1    |DX2    |DX3   |DX4   |DX5
M51.27 |M54.17 |G83.4 |G83.4 |G83.4
如果我有一张像上面这样的桌子

ID | Name

 1 | Joe

 2 | Eric

 3 | Steve

 4 | John
还有什么要回去的吗

SELECT TOP 5 Name FROM Table

你真正做的是旋转。所以,枢轴!尝试以下小查询:

Joe

Eric

Steve

John

NULL
要回答关于获取未插入行集的第二个问题,基本上要做相同的事情,但要以某种方式提供5行,并将其左连接到所需的数据

WITH Top5 AS (
   SELECT TOP 5
      Dx = 'DX' + Convert(varchar(11), Row_Number() OVER (ORDER BY pvd.Listorder)),
      pvd.Code
   FROM dbo.PatientVisitDiags pvd
   WHERE pvd.PatientVisitId = @patientVisitId
)
SELECT *
FROM
   Top5 t
   PIVOT (Max(Code) FOR Dx IN (DX1, DX2, DX3, DX4, DX5)) p
;
旁注

你这样做的事实是:

WITH Data AS (
   SELECT TOP 5
      Seq = Row_Number() OVER(ORDER BY ID),
      Name
   FROM dbo.Table
   ORDER BY ID
)
SELECT
   n.Seq,
   t.Name
FROM
   (VALUES
      (1), (2), (3), (4), (5) -- or a numbers-generating CTE perhaps
   ) n (Seq)
   LEFT JOIN Top 5 t
      ON n.Seq = t.Seq
;
告诉我你没有使用ANSI连接。停止别再那样做了。将此连接条件放入
join
ON
子句中。2016年。。。为什么要使用上个世纪的连接语法


哦,在表名上加上模式前缀。查一查——您将发现您应该这样做的实际性能原因。这不仅关系到找到正确模式所需的时间,还关系到执行计划缓存…

您真正做的是旋转。所以,枢轴!尝试以下小查询:

Joe

Eric

Steve

John

NULL
要回答关于获取未插入行集的第二个问题,基本上要做相同的事情,但要以某种方式提供5行,并将其左连接到所需的数据

WITH Top5 AS (
   SELECT TOP 5
      Dx = 'DX' + Convert(varchar(11), Row_Number() OVER (ORDER BY pvd.Listorder)),
      pvd.Code
   FROM dbo.PatientVisitDiags pvd
   WHERE pvd.PatientVisitId = @patientVisitId
)
SELECT *
FROM
   Top5 t
   PIVOT (Max(Code) FOR Dx IN (DX1, DX2, DX3, DX4, DX5)) p
;
旁注

你这样做的事实是:

WITH Data AS (
   SELECT TOP 5
      Seq = Row_Number() OVER(ORDER BY ID),
      Name
   FROM dbo.Table
   ORDER BY ID
)
SELECT
   n.Seq,
   t.Name
FROM
   (VALUES
      (1), (2), (3), (4), (5) -- or a numbers-generating CTE perhaps
   ) n (Seq)
   LEFT JOIN Top 5 t
      ON n.Seq = t.Seq
;
告诉我你没有使用ANSI连接。停止别再那样做了。将此连接条件放入
join
ON
子句中。2016年。。。为什么要使用上个世纪的连接语法


哦,在表名上加上模式前缀。查一查——您将发现您应该这样做的实际性能原因。这不仅关系到找到正确模式所需的时间,还关系到执行计划缓存…

一次一个-回答最后一个问题

创建一个包含大量空值的表

where pvd.PatientVisitId = pv.PatientVisitId

一次一个-回答最后一个问题

创建一个包含大量空值的表

where pvd.PatientVisitId = pv.PatientVisitId