Phi*_*enn 5 sql t-sql sql-server sql-server-2005
在Microsoft SQL Server 2005或更高版本中,我想获取第一行,如果没有匹配的行,则返回具有默认值的行.
SELECT TOP 1 ID,Name
FROM TableName
UNION ALL
SELECT 0,''
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)
这是有效的,除非它在表中有数据时返回两行,如果没有则返回1行.我希望它总能返回1排.我认为它与EXISTS有关,但我不确定.它会是这样的:
SELECT TOP 1 * FROM Contact
WHERE EXISTS(select * from contact)
Run Code Online (Sandbox Code Playgroud)
但如果不是EXISTS,那么选择0,''
当表格非常满并且您可能想要指定前1的哪一行(例如名字)时会发生什么?如果您只是更改ORDER BY子句,那么OMG Ponies的查询将返回错误的答案.他的查询也比这次修改花了大约8%的CPU(虽然它有相同的读数)
SELECT TOP 1 *
FROM (
SELECT TOP 1 ID,Name
FROM TableName
ORDER BY Name
UNION ALL
SELECT 0,''
) X
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)
不同的是,内部查询具有顶部1也和其 TOP 1可以有指定的(如图所示).
只是为了好玩,这是另一种方法,它与上述查询非常接近(-15ms到+ 30ms).虽然这对于这样一个简单的查询来说比复杂的要复杂得多,但它演示了一种我没有看到其他SQL人经常使用的技术.
SELECT
ID = Coalesce(T.ID, 0),
Name = Coalesce(T.Name, '')
FROM
(SELECT 1) X (Num)
LEFT JOIN (
SELECT TOP 1 ID, Name
FROM TableName
ORDER BY ID DESC
) T ON 1 = 1 -- effective cross join but does not limit rows in the first table
Run Code Online (Sandbox Code Playgroud)
使用:
SELECT TOP 1
x.id,
x.name
FROM (SELECT t.id,
t.name
FROM TABLENAME t
UNION ALL
SELECT 0,
'') x
ORDER BY id DESC
Run Code Online (Sandbox Code Playgroud)
使用CTE等效物:
WITH query AS (
SELECT t.id,
t.name
FROM TABLENAME t
UNION ALL
SELECT 0,
'')
SELECT TOP 1
x.id,
x.name
FROM query x
ORDER BY x.id DESC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6790 次 |
| 最近记录: |