繁体   English   中英

SQL DB2为多个ID实例选择多个列值

[英]SQL DB2 Select multiple columns values for multiple instances of IDs

这是我的数据:

| ID | FIELD1 | FIELD2 | FIELD3 |
|-------------------------------|
| 1  |  NULL  | value1 | value2 |
|-------------------------------|
| 2  |  NULL  | value3 |  NULL  |
|-------------------------------|
| 3  | value4 |  NULL  |  NULL  |
|-------------------------------|
| 4  | value5 | value6 | value7 |
|-------------------------------|
| .. |  ...   |  ....  |  ....  |

这是我需要选择的:

| ID | ID2 | FIELDX |
|-------------------|
| 1  | 10  | value1 |
| 1  | 10  | value2 |
| 2  | 20  | value3 |
| 3  | 30  | value4 |
| 4  | 40  | value5 |
| 4  | 40  | value6 |
| 4  | 40  | value7 |
| .. | ..  |  ....  |

数据的顺序并不重要。 重要的是,每个ID对于每个关联的FIELD1,2,3 ...值都会出现一次。 请注意,有很多字段。 我只是选择使用这三个示例。

我对解决方案的尝试是以下查询:

SELECT x.ID, a.ID2, x.FIELDX
FROM (
SELECT t.ID, t.FIELD1
FROM SCHEMA1.TABLE1 t
UNION ALL
SELECT t.ID, t.FIELD2
FROM SCHEMA1.TABLE1 t
UNION ALL
SELECT t.ID, t.FIELD3
FROM SCHEMA1.TABLE1 t
) x
JOIN SCHEMA2.TABLE2 a ON x.ID = a.ID
WHERE x.FIELDX != NULL
WITH UR;

尽管这样做确实可行,但我不想为每个其他字段添加新的内部选择语句。 而且,我觉得似乎有一种更有效的方法。

请指教。

DB2没有明确的unpivot ,您的方法很好。 一种更有效的方法可能是:

SELECT id, id2, fieldx
FROM (SELECT x.ID, a.ID2,
             (case when col = 'field1' then field1
                   when col = 'field2' then field2
                   when col = 'field3' then field3
              end) as FIELDX
      FROM SCHEMA1.TABLE1 x join
           SCHEMA2.TABLE2 a
           on x.ID = a.ID cross join
           (select 'field1' as col from sysibm.sysdummy1 union all
            select 'field2' from sysibm.sysdummy1 union all
            select 'field3' from sysibm.sysdummy1
           ) c
     ) x
WHERE x.FIELDX is not NULL;

这并不一定简化代码。 它确实使DB2更容易优化连接。 它只需要读取一次table1 ,而不需要为每一列读取一次。

注意:您应该使用fieldx is not null而不是fieldx != null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM