加入显示空值
Posted
技术标签:
【中文标题】加入显示空值【英文标题】:Join showing null values 【发布时间】:2018-08-02 14:06:00 【问题描述】:我有以下疑问:
SELECT
ORD_CODE,
ORL_EVENT,
ACT_ACT
FROM
R5ORDERS inner join R5ORDERLINES on ORD_CODE = ORL_ORDER
inner join R5ACTIVITIES on ACT_ORDER = ORL_ORDER
WHERE
ORL_EVENT = '144933'
GROUP BY
ORD_CODE, ORL_EVENT, ACT_ACT
ORDER BY
ACT_ACT
它显示正确的数据,但 ACT_ACT 不显示某些值(如 10),因为在这种情况下 ORD_CODE 为空。
这是我得到的:
ORD_CODE ORL_EVENT ACT_ACT
22057 144933 20
22145 144933 30
22146 144933 40
22147 144933 50
我尝试使用 LEFT 或 RIGHT 连接,但没有任何变化。我想要这个:
ORD_CODE ORL_EVENT ACT_ACT
NULL 144933 10
22057 144933 20
22145 144933 30
22146 144933 40
22147 144933 50
样本数据:
R5ORDERS 表
ORD_CODE
22057
22145
22146
22147
R5ORDERLINES 表
ORL_ORDER ORL_EVENT ORL_PRICE ORL_ORDQTY
22057 10 1000 2
22145 10 50 10
22146 10 25 5
22147 10 20 1
R5ACTIVITIES 表
ACT_ORDER ACT_ACT
NULL 10
22057 20
22145 30
22146 40
22147 50
这是可消耗格式的示例数据,以便其他人可以使用它。
declare @Orders table
(
ORD_CODE int
)
insert @Orders values
(22057)
, (22145)
, (22146)
, (22147)
declare @OrderLine table
(
ORL_ORDER int
, ORL_EVENT int
, ORL_PRICE int
, ORL_ORDQTY int
)
insert @OrderLine values
(22057, 10, 1000, 2)
,(22145, 10, 50, 10)
,(22146, 10, 25, 5)
,(22147, 10, 20, 1)
declare @Activities table
(
ACT_ORDER int
, ACT_ACT int
)
insert @Activities values
(NULL , 10)
, (22057, 20)
, (22145, 30)
, (22146, 40)
, (22147, 50)
【问题讨论】:
用一些示例数据编辑问题。 不使用聚合函数时为什么要 GROUP BY? 因为有一个我最初为更清晰而编辑的......只是添加了一些示例日期。 您应该使用一些别名并将它们包含在每一列中。任何人都不可能知道每列属于哪个表。 当连接无法将该行与订单匹配时,您希望如何显示 ACT_ACT 为 10? 【参考方案1】:看来你根本需要left join
:
select r1.ACT_ORDER as ORD_CODE, r2.ORL_EVENT, r3.ACT_ACT
from R5ACTIVITIES r1 left join
R5ORDERLINES r2
on r2.ORL_ORDER = r1.ACT_ORDER left join
R5ORDERS r3
on r3.ORD_CODE = r2.ORL_ORDER;
【讨论】:
如果我这样做(从 R5ACTIVITIES 中选择),我可以看到 ACT_ACT 10,但它会返回很多重复的行。我会为每个 ORD_CODE 重复 ACT_ACT。【参考方案2】:您正在对 R5ORDERS 和 R5ORDERLINES 使用内部联接。不会显示空值,因为按定义进行的内连接会选择两个表中具有匹配值的记录。要显示所有 ACT_ACT 值,请从 R5ACTIVITIES 中选择并使用左连接将其他表连接到它。
【讨论】:
【参考方案3】:试试这个:
FROM R5ACTIVITIES LEFT join R5ORDERLINES on ACT_ORDER = ORL_ORDER
RIGHT join R5ORDERS on ORD_CODE = ORL_ORDER
【讨论】:
另外,如果要检索 NULL 值,则不能使用内部联接 已经尝试过左右连接,没有任何变化。这就是为什么在我找到真正的解决方案之前我仍然使用内部连接......以上是关于加入显示空值的主要内容,如果未能解决你的问题,请参考以下文章