sql - 如果没有返回行,则返回具有空值的行

标签 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.

我的查询是一个子查询:

(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; 

例如,我尝试了以下方法:

(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; 

这将返回 NULL,无论 'myvalue' 是否存在。我想要的是,如果条目存在,它会返回查询的值,如果不存在,它会在每一列上返回 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; 

这里的主要问题是,如果 'myvalue' 没有匹配项,则整个查询不会返回任何内容。其他查询不需要 myvalue 并且进行多个独立查询不是性能限制的选项。

我远非 SQL 专家,任何正确方向的建议将不胜感激。

类似问题但不适用于此处:

  • 1 , 2 , 3等等……

最佳答案

您可以使用 left outer join 做到这一点:

with s as (<your subquery here>)
select s.*
from (select 1 as x) x left join
     s
     on x.x = 1;

这将返回表中的任一值。如果没有匹配项,则查询返回一行,所有列均为 NULL

注意:CTE 不是必需的。我只是为了强调查询的逻辑。您可以将子查询放在 s 所在的位置。

关于sql - 如果没有返回行,则返回具有空值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33127872/

相关文章:

sql - 帮助数据库结构

java - 如何使用 SmartGWT 和 SQL 实现惰性列表

sql-server - 如何从“连接到服务器”对话框中删除缓存的服务器名称?

mysql - 将带子查询的 MS Access 查询转换为 MySQL

mysql - 连接表上的多个查询并获取单个选择结果

java - JUnit,如何测试截断表

mysql - 我如何使用sql来选择这个

sql-server - 在 SQL Server 中获取一周的第一天

sql - 在 SQL Server 中使用具有两个条目(值)的同一个表中的另一列更新列

mysql - 具有内连接、子选择和限制的 SQL 选择