2017-10-17 101 views
2

我的SQL Server存儲過程查詢輸出有問題。目前正在使用此:我如何得到我想要的結果? SQL Server 2005

SELECT * 
FROM Head H 
INNER JOIN Line L ON H.invno = L.invno 
INNER JOIN Misc M ON H.invno = M.invno 
INNER JOIN QSMU Q ON H.invno = Q.invno 
WHERE H.invno = @Invno 
    AND L.deleted = 0 
    AND M.deleted = 0 
    AND Q.deleted = 0 

這段代碼的目的是爲了顯示除了刪除一個對我的報告服務的一切

(使用「刪除」列名,而不是丟棄一些行(S)過濾。)現在的問題是,如果其中一個沒有數據,例如:表M沒有任何東西,那麼輸出將是空白的。

Iv'e試圖改變邏輯OR,但你知道,輸出將是有趣的(「被刪除= 1」將在輸出中顯示,我不希望出現這種情況。

+0

你可能需要一個'LEFT JOIN'雖然你」由於你的'FROM'子句是非常沒用的,所以我遇到了一個更大的問題。 –

+1

您錯過了select中的一些表格,請提供有關數據和表格結構的完整信息。 – tukan

+0

@tukan包括在內,對不起早期 –

回答

3

使用外連接並移動deleted檢查到連接條件(可選在主表的情況下)。

SELECT * 
FROM Head H 
LEFT JOIN Line L ON H.invno = L.invno 
    AND L.deleted = 0 
LEFT JOIN Misc M ON H.invno = M.invno 
    AND M.deleted = 0 
LEFT JOIN QSMU Q ON H.invno = Q.invno 
    AND Q.deleted = 0 
WHERE H.invno = @Invno 

INNER VS OUTER

Head INNER JOIN Line ...只在該Head行與第二個表中的Line行匹配,即顯示至少有1個訂單項的訂單。

Head LEFT JOIN Line ...取所有的Head行並附加Line行(如果可用,否則爲NULL),即顯示所有訂單,也顯示所有訂單,也包含沒有行項目的訂單。

+0

它的工作原理,非常感謝你:)你能說明爲什麼我們需要使用'LEFT JOIN'來代替嗎? –

+0

是啊,它確實有道理,非常感謝你:) –

0

嗯,我不知道表的結構,但從你的select我看你有inner join

你應該明白這是什麼意思 - 你在做什麼是HM的交集(更多信息請參見Venn diagrams)。

你應該做的LEFT JOINSLMQ失蹤(仍保持你的選擇結構),即使這說明你H所有結果:

SELECT * 
FROM Head H 
LEFT JOIN Line L ON H.invno = L.invno 
LEFT JOIN Misc M ON H.invno = M.invno 
LEFT JOIN QSMU Q ON H.invno = Q.invno 
WHERE H.invno = @Invno 
    AND L.deleted = 0 
    AND M.deleted = 0 
    AND Q.deleted = 0 
+1

即使有外連接,where子句仍可能會過濾出行,例如,如果'Misc'中沒有數據,'M.deleted'將爲NULL。 –

+0

@MarekGrzenkowicz:是。從這個問題我明白,她希望所有在'頭',但不在其他表中的'頭'和'附加條件'。 – tukan

+0

我的理解是: - 從每個表中除去標記爲deleted_的所有行。 –