我如何得到我想要的结果? SQL Server 2005
我的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”将在输出中显示,我不希望出现这种情况。
使用外连接并移动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),即显示所有订单,也显示所有订单,也包含没有行项目的订单。
它的工作原理,非常感谢你:)你能说明为什么我们需要使用'LEFT JOIN'来代替吗? –
是啊,它确实有道理,非常感谢你:) –
嗯,我不知道表的结构,但从你的select
我看你有inner join
。
你应该明白这是什么意思 - 你在做什么是H
和M
的交集(更多信息请参见Venn diagrams)。
你应该做的LEFT JOINS
从L
或M
或Q
失踪(仍保持你的选择结构),即使这说明你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
即使有外连接,where子句仍可能会过滤出行,例如,如果'Misc'中没有数据,'M.deleted'将为NULL。 –
@MarekGrzenkowicz:是。从这个问题我明白,她希望所有在'头',但不在其他表中的'头'和'附加条件'。 – tukan
我的理解是: - 从每个表中除去标记为deleted_的所有行。 –
你可能需要一个'LEFT JOIN'虽然你”由于你的'FROM'子句是非常没用的,所以我遇到了一个更大的问题。 –
您错过了select中的一些表格,请提供有关数据和表格结构的完整信息。 – tukan
@tukan包括在内,对不起早期 –