Joz*_*oze 1 sql sql-server subquery
如果返回的一个值没有返回任何行,那么有很多关于如何返回NULL的问题.但是,当没有返回结果时,我没有发现任何关于多值查询返回NULL的信息.
主要查询:
SELECT UserOpinion.*, x, y, z... FROM subquery, (x) AS x, (y) AS y...
I trust you get the gist.
Run Code Online (Sandbox Code Playgroud)
我的查询是一个子查询:
(SELECT TOP 1
u.BADId,
Date,
State,
Note,
Comment,
Alias,
Title,
UserId,
o.Id AS OpinionId
FROM
[Opinion] o
RIGHT JOIN
[User] u
ON
o.UserId = u.Id
WHERE
(Date IS NULL OR (Date = (SELECT MAX(Date)
FROM [Opinion]
WHERE UserId = o.UserId )))
AND
u.BADId = 'myvalue') AS UserOpinion;
Run Code Online (Sandbox Code Playgroud)
例如,我尝试过以下方法:
(SELECT TOP 1 * FROM (SELECT TOP 1
u.BADId,
Date,
State,
Note,
Comment,
Alias,
Title,
UserId,
o.Id AS OpinionId
FROM
[Opinion] o
RIGHT JOIN
[User] u
ON
o.UserId = u.Id
WHERE
(Date IS NULL OR (Date = (SELECT MAX(Date)
FROM [Opinion]
WHERE UserId = o.UserId )))
AND
u.BADId = 'myvalue'
UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) t) AS UserOpinion;
Run Code Online (Sandbox Code Playgroud)
无论' myvalue '是否存在,都会返回NULL .我想要的是,如果条目存在,它返回查询的值,或者如果不存在则返回每个列的null.
我也尝试过以下方法:
(COALESCE(SELECT TOP 1
u.BADId,
Date,
State,
Note,
Comment,
Alias,
Title,
UserId,
o.Id AS OpinionId
FROM
[Opinion] o
RIGHT JOIN
[User] u
ON
o.UserId = u.Id
WHERE
(Date IS NULL OR (Date = (SELECT MAX(Date)
FROM [Opinion]
WHERE UserId = o.UserId )))
AND
u.BADId = 'myvalue'), NULL) AS UserOpinion;
Run Code Online (Sandbox Code Playgroud)
这里的主要问题是如果' myvalue '没有匹配,整个查询都不会返回任何内容.其他查询不需要myvalue,并且进行多个独立查询不是性能约束的选项.
我远非SQL专家,任何正确方向的建议将不胜感激.
类似问题但不适用于此:
你可以这样做left outer join:
with s as (<your subquery here>)
select s.*
from (select 1 as x) x left join
s
on x.x = 1;
Run Code Online (Sandbox Code Playgroud)
这将返回表中的值.如果您不匹配,则查询返回一行,其中所有列都是NULL.
注意:CTE不是必需的.我只是强调了查询的逻辑.您可以将子查询放在何处s.
| 归档时间: |
|
| 查看次数: |
1776 次 |
| 最近记录: |