2016-12-07 59 views
0

我需要一個查詢,即使它們在表中沒有匹配的數據,也會返回行。我知道一個空的結果集將被返回,但作爲我的項目必需品,我需要在結果集中獲得一行。儘管這些值是空值,但這是可以接受的。下面是我的查詢:獲取定義的行而不是空的結果集:SQL Server

select Demographic_Id, Total from school.Demographic_Profile where Demographic_Id=2 

沒有與Demographic_Id等於2。沒有數據我仍然需要得到這樣的結果:

Demographic_Id |總計

 2   | NULL 

任何建議都會有很大幫助!

+0

是否有有你可能需要的所有demographic_ids表? – SQLChao

+0

這個問題解決了嗎?你需要進一步的幫助嗎?請允許我提示一個提示:如果這個問題已經解決,那麼在(最佳)答案的投票櫃檯下面勾選驗收檢查將會非常友善。這將1)標記此問題已解決2)使追隨者更容易找到最佳解決方案3)支付點給答覆者和4)支付點給你。既然你已經跨越了15分的邊界,你還需要額外的投票。這是SO的方式來說聲謝謝。快樂編碼! – Shnugo

回答

1

如果你會得到完全相同的一行或零行,然後一招就是用聚集:

select 2 as Demographic_Id, max(Total) as Total 
from school.Demographic_Profile 
where Demographic_Id = 2; 
+0

這有幫助,但很少修改 –

+0

選擇ISNULL(MAX(Demographic_Id),2)作爲Demographic_Id,來自學校的總數.Demographic_Profile其中Demographic_Id(2) –

+0

@shaikirshadsharif。 。 。它甚至可以進一步簡化。 –

0

你也可以使用一個外部聯接

select v.did As Demographic_Id, 
     Total 
from (values(2)) v(did) 
LEFT JOIN school.Demographic_Profile ON Demographic_Id=v.did 
0

您可以使用一個CTE。 CTE將創建派生表。 UNION ALL將附加一行,但僅限於查詢未返回任何行。否則,查詢將返回正如預期:

WITH CTE AS 
(
    SELECT object_id 
      ,name 
    FROM sys.objects 
    WHERE name='non-existent' 
) 
SELECT * FROM CTE 
UNION ALL 
SELECT 2,NULL WHERE (SELECT COUNT(*) FROM CTE)=0 

對於你的情況試試這個:

DECLARE @id INT=2 
WITH CTE AS 
(
    select Demographic_Id, Total 
    from school.Demographic_Profile 
    where [email protected] 
) 
SELECT * FROM CTE 
UNION ALL 
SELECT @id,NULL WHERE (SELECT COUNT(*) FROM CTE)=0 
0
select Demographic_Id, Total from 
    (SELECT 1 as did 
    UNION ALL 
    SELECT 2 as did 
    UNION ALL 
    SELECT 3 as did) as innerQuery 
    left outer join school.Demographic_Profile on did = Demographic_Id