2017-10-17 68 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_的所有行。 –