我如何得到我想要的结果? SQL Server 2005

时间:2017-10-17 07:13:34

标签: sql-server tsql stored-procedures

我的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'会显示在输出中,我不想要

2 个答案:

答案 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 

INNER vs OUTER

Head INNER JOIN Line ...仅获取第二个表中具有匹配Head行的Line行,即显示至少包含1个订单项的订单。

Head LEFT JOIN Line ...获取所有Head行并附加Line行(如果可用;否则为NULL),即显示所有订单,也显示没有订单项的订单。

答案 1 :(得分:0)

我不知道表格的结构,但是从select我知道你有inner join

你应该明白这意味着什么 - 你正在做的是HM的交集(更多见Venn diagrams)。

您应该完成LEFT JOINS,即使在HLM中遗失,也会显示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