我的SQL Server存储过程查询输出有问题。目前使用此:
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
此代码用于显示我的报告服务中除删除的所有内容之外的所有内容(使用'已删除的'列名称过滤它而不是删除某些行。)
现在的问题是,如果其中一个没有数据,例如:表格M没有任何内容,则输出将为空白。
我尝试将逻辑更改为OR,但是你知道,输出会很有趣(' Deleted = 1'会显示在输出中,我不想要
答案 0 :(得分: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
Head INNER JOIN Line ...
仅获取第二个表中具有匹配Head
行的Line
行,即显示至少包含1个订单项的订单。
Head LEFT JOIN Line ...
获取所有Head
行并附加Line
行(如果可用;否则为NULL),即显示所有订单,也显示没有订单项的订单。
答案 1 :(得分:0)
我不知道表格的结构,但是从select
我知道你有inner join
。
你应该明白这意味着什么 - 你正在做的是H
和M
的交集(更多见Venn diagrams)。
您应该完成LEFT JOINS
,即使在H
或L
或M
中遗失,也会显示Q
的所有结果(仍保留您的选择结构) ):
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