2015-10-14 150 views
1

如果一個返回的查詢返回沒有行,如何返回NULL還有很多問題。但是當沒有結果返回時,我沒有發現有關多值查詢返回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'存在。我想要的是,如果條目存在,它會返回查詢的值,或者如果沒有條目,它會在每列上返回空值。

我也試過如下:

(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專家,任何有關正確方向的建議都將不勝感激。

類似的問題,但在這裏不適用:

  • 123等...

回答

4

你可以用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的地方。