我有这个问题:
SELECT
IT_approvaldate
FROM
t_item
WHERE
IT_certID_fk_ind = (SELECT DISTINCT TOP 1 IT_certID_fk_ind
FROM t_item
WHERE IT_rfileID_fk = '4876')
ORDER BY
IT_typesort
运行此查询时的结果:
我需要获得前1名的结果。 (2013-04-27 00:00:00)问题是我选择前1名,获得第2名结果。
我认为这两个结果中列值的原因与列值相同。 请看下面,
但是,我的查询结果只需要IT_approvaldate
列前1位。
我该怎么做?任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以使用以下查询并检查
SELECT IT_approvaldate FROM t_item WHERE IT_certID_fk_ind =(SELECT DISTINCT top 1 IT_certID_fk_ind FROM t_item WHERE IT_rfileID_fk ='4876' ) and IT_approvaldate is not null ORDER BY IT_typesort
这将从结果中删除空值
答案 1 :(得分:1)
TSQL
选择查询本质上不具有确定性。您必须添加一个平局或另一行不是。
理论是SQL Server
不会假设NULL
值大于或小于你的行,并且因为你的select语句在你的HAVING
子句之前没有逻辑实现,顺序取决于数据库的设置方式。
了解SQL Server可能不一定两次选择相同的路径,除非它认为它绝对更好。这就是ORDER BY
子句的原因,它将一致地处理NULL(假设有一个唯一的分组)。
<强>更新强>
在ORDER BY
上添加MSDN文档的链接似乎是个好主意。确实,从Standard
/ MSDN
开始是一个好习惯。 ORDER BY Clause - MSDN
答案 2 :(得分:1)
如果您希望NULL成为排序列表中的最后一个值,您可以使用ISNULL
子句中的ORDER BY
将NULL
替换为MAX value of DATETIME
下面的代码可能会有所帮助:
SELECT TOP 1 IT_approvaldate
FROM t_item
WHERE IT_certID_fk_ind = (SELECT DISTINCT top 1 IT_certID_fk_ind FROM t_item WHERE IT_rfileID_fk ='4876' )
ORDER BY IT_typesort ASC, ISNULL(IT_approvaldate,'12-31-9999 23:59:59') ASC;