选择并显示空列,以防不满足 where 子句的一个条件(因为其他表中不存在元素)



我有 2 个表,表 1 和表 2。

Table1 has columns P_KEY, ID, some_value, some_value2, ....
Table2 has columns P2_KEY, RELATED_DATA, F_KEY, DATA_VALUE.

表1的P_KEY和ID是唯一的对。对于表1的每个P_KEY(以及每个ID),表2有多个F_KEY条目,每个ID都有各种数据。RELATED_DATA行具有特定的值(来自其他地方定义的范围),这些值定义了为每个 ID 存储的数据类型。我需要选择ID的DATA_VALUE,其中RELATED_DATA为1和500。如果其中一个或两个都不存在,我仍然想显示带有(示例)的行:

ID, DATA_VALUE (where RELATED_DATA=500), <empty column>
ID, <empty column>, DATA_VALUE (where RELATED_DATA=1)
ID, <empty column>, <empty column>
ID, DATA_VALUE (where RELATED_DATA=500), DATA_VALUE (where RELATED_DATA=1)

我有一个如下所示的 SQL,即使 B1 也是如此,我也需要在 A.ID 中显示行。RELATED_DATA和/或 B2。RELATED_DATA不存在(表 2 中没有行条目),或者这是空字符串,具有 B1。DATA_VALUE和/或 B2。显示为空单元格DATA_VALUE单元格:

select A.ID, B1.DATA_VALUE, B2.DATA_VALUE
from table1 A, table2 B1, table2 B2 
where B1.F_KEY = A.P_KEY
and B2.F_KEY = A.P_KEY
and B1.RELATED_DATA = 500
and B2.RELATED_DATA = 1
and A.ID='OneValue';

目的是了解B1时的情况。RELATED_DATA=500 和/或 B2。RELATED_DATA=1 行不存在,或者它们是 ID 的空字符串。

谢谢。

您需要

做的是透视 table2 中的行,以使这两个data_values作为列,而不是行。然后,您可以像这样将其连接回表1:

select a.id,
       b.data_value_500,
       b.data_value_1
from   table1 a
       inner join (select   f_key,
                            max(case when related_data = 500 then data_value end) data_value_500,
                            max(case when related_data = 1 then data_value end) data_value_1
                   from     table2
                   group by f_key) b on (a.p_key = b.f_key)
where  a.id = 'OneValue';

:注:我使用了一个inner join,假设表 2 中对于表 1 中的每个p_key始终存在一行。如果不是这种情况,请改为切换到left outer join


此外,如果您使用的是 Oracle 11g 或更高版本,则可以使用内置的 PIVOT 功能来执行 table2 的透视:

select a.id,
       b.data_value_500,
       b.data_value_1
from   table1 a
       inner join (select f_key,
                          data_value_1,
                          data_value_500
                   from   table2
                   pivot (max(data_value) for related_data in (1 as data_value_1,
                                                               500 as data_value_500)))
where  a.id = 'OneValue';

最新更新