2015-09-18 32 views
1

我有以下查詢。我簡化了它的演示目的。我使用SQL Server - T-SQL如果子查詢檢索多個記錄,則分配空值。如何做呢?

Select tm.LocID = (select LocID from tblLoc tl 
        where tl.LocID = tm.LodID) 
from tblMain tm 

如果子查詢返回多條記錄,我想要分配tm.LocID到別的空如果只有1返回的記錄,然後將其分配給tm.LocID。我正在尋找一個簡單的方法來做到這一點。任何幫助,將不勝感激。

我可以看到的一種方法是擁有一個CASE語句,並檢查(Count *> 1)是否分配null,否則返回該值,但這需要select語句中的select語句。

回答

0

您有關於使用case表達式count(*)想法是正確的,但它不會要求其它子查詢:

SELECT tm.LocID = (SELECT CASE COUNT(*) WHEN 1 THEN MAX(LocID) END 
        FROM tblLoc tl 
        WHERE tl.LocID = tm.LodID) 
FROM tblMain tm 
0

您上面的查詢(和其他許多答案在這裏)是一個相關的子查詢這將是非常緩慢,因爲它在每個記錄上執行單獨的聚合查詢。這下面將解決您的問題和潛在執行好一點,因爲計數發生在一次通過。

SELECT 
    CASE 
    WHEN x.locid IS NOT NULL THEN x.locid 
    ELSE NULL 
    END 
FROM tblMain m 
LEFT JOIN (
    SELECT 
    locid 
    FROM tblLoc 
    GROUP BY locid 
    HAVING COUNT(1) = 1 
) x 
    ON x.locid = m.locid 
; 

以上是Postgres語法(我很熟悉),所以你必須使它與TSQL兼容。

0

或只使用一個HAVING條款,如

Select tm.LocID = (select LocID from tblLoc tl 
        where tl.LocID = tm.LodID 
        group by locID 
        having count(*) = 1) 
) 
from tblMain tm 
相關問題