加入显示空值

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 值,则不能使用内部联接 已经尝试过左右连接,没有任何变化。这就是为什么在我找到真正的解决方案之前我仍然使用内部连接......

以上是关于加入显示空值的主要内容,如果未能解决你的问题,请参考以下文章

hadoop中空值显示0

UWP 绑定不显示空值

Obiee 度量仅显示空值

蜂巢显示空值

sql在查询之间不显示空值

sql语句返回类型为hashmap的时候空值的字段会显示吗