如何使用 H2 数据库中包含数组的列来获取 n 1 行
How to work with column containg array in H2 database to get n 1 row
我是 H2 数据库的新手。例如,我在数据库中有 3 tables,
table t1 :
ID
desc
something
condition_id
1
EN 142868 151508
XYZ
[4686, 4687]
table条件
CONDITION_ID
desc
COLUMN3
4686
desc1
something1
4687
desc2
something2
我需要这样的输出
ID
desc
t1something
joined Column
1
EN 142868 151508
XYZ
desc1 something1, desc2 somethin2
如何做到这一点,我尝试使用 array_contains,但结果它给出了 2 行,例如' t1ID t1desc t1something joined Column 1 EN 142868 151508 XYZ desc1 something1 1 EN 142868 151508 XYZ desc2 somethin2
请帮忙。提前谢谢你
您需要对来自 table T1
的行进行分组并聚合来自 table CONDITION
:
的行
CREATE TABLE T1(ID INT, DESC VARCHAR, SOMETHING VARCHAR, CONDITION_ID INT ARRAY)
AS VALUES (1, 'EN 142868 151508', 'XYZ', ARRAY[4686, 4687]);
CREATE TABLE CONDITION(CONDITION_ID INT, DESC VARCHAR, COLUMN3 VARCHAR)
AS VALUES (4686, 'desc1', 'something1'), (4687, 'desc2', 'something2');
SELECT T1.ID, T1.DESC, T1.SOMETHING,
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ') JOINED_COLUMN
FROM T1 LEFT JOIN CONDITION ON ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
GROUP BY T1.ID, T1.DESC, T1.SOMETHING;
> ID | DESC | SOMETHING | JOINED_COLUMN
> -- | ---------------- | --------- | ----------------------------------
> 1 | EN 142868 151508 | XYZ | desc1 something1, desc2 something2
如果要排除 T1
中没有 CONDITION
中相应条目的行,请使用内部 JOIN
而不是 LEFT JOIN
。
如果您需要一些确切的条目顺序,您可能还想将 WITHIN GROUP (ODRER BY some_columns)
子句添加到 LISTAGG
聚合函数:
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
WITHIN GROUP (ORDER BY CONDITION.CONDITION_ID)
JOINED_COLUMN
或者,您可以使用子查询:
SELECT T1.ID, T1.DESC, T1.SOMETHING,
(
SELECT LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
FROM CONDITION
WHERE ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
) JOINED_COLUMN
FROM T1;
我是 H2 数据库的新手。例如,我在数据库中有 3 tables,
table t1 :
ID | desc | something | condition_id |
---|---|---|---|
1 | EN 142868 151508 | XYZ | [4686, 4687] |
table条件
CONDITION_ID | desc | COLUMN3 |
---|---|---|
4686 | desc1 | something1 |
4687 | desc2 | something2 |
我需要这样的输出
ID | desc | t1something | joined Column |
---|---|---|---|
1 | EN 142868 151508 | XYZ | desc1 something1, desc2 somethin2 |
如何做到这一点,我尝试使用 array_contains,但结果它给出了 2 行,例如' t1ID t1desc t1something joined Column 1 EN 142868 151508 XYZ desc1 something1 1 EN 142868 151508 XYZ desc2 somethin2
请帮忙。提前谢谢你
您需要对来自 table T1
的行进行分组并聚合来自 table CONDITION
:
CREATE TABLE T1(ID INT, DESC VARCHAR, SOMETHING VARCHAR, CONDITION_ID INT ARRAY)
AS VALUES (1, 'EN 142868 151508', 'XYZ', ARRAY[4686, 4687]);
CREATE TABLE CONDITION(CONDITION_ID INT, DESC VARCHAR, COLUMN3 VARCHAR)
AS VALUES (4686, 'desc1', 'something1'), (4687, 'desc2', 'something2');
SELECT T1.ID, T1.DESC, T1.SOMETHING,
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ') JOINED_COLUMN
FROM T1 LEFT JOIN CONDITION ON ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
GROUP BY T1.ID, T1.DESC, T1.SOMETHING;
> ID | DESC | SOMETHING | JOINED_COLUMN
> -- | ---------------- | --------- | ----------------------------------
> 1 | EN 142868 151508 | XYZ | desc1 something1, desc2 something2
如果要排除 T1
中没有 CONDITION
中相应条目的行,请使用内部 JOIN
而不是 LEFT JOIN
。
如果您需要一些确切的条目顺序,您可能还想将 WITHIN GROUP (ODRER BY some_columns)
子句添加到 LISTAGG
聚合函数:
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
WITHIN GROUP (ORDER BY CONDITION.CONDITION_ID)
JOINED_COLUMN
或者,您可以使用子查询:
SELECT T1.ID, T1.DESC, T1.SOMETHING,
(
SELECT LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
FROM CONDITION
WHERE ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
) JOINED_COLUMN
FROM T1;