我需要将一个表中的多行与另一张表合并为结果中的一行。我的表是这样设计的:
或类似。
有什么想法吗?给出的可用标签数量有限(<10)。
我尝试过的任何标准联接都会给我几行以得到具有相同customer_id的结果
表1:
CUSTOMER_ID | FIRSTNAME | LASTNAME
1 | ALICE | MILLER
2 | BOB | SMITH
表2:
ID | CUSTOMER_ID | TAG
1 | 1 | PRO-CUSTOMER
2 | 1 | ADMIN
3 | 2 | PRO CUSTOMER
...
我需要一个类似的结果/视图
ID | FIRSTNAME | LASTNAME | TAG | TAG
1 | ALICE | MILLER | PRO CUSTOMER | ADMIN
2 | BOB | SMITH | PRO CUSTOMER |
或类似...
答案 0 :(得分:0)
SQL查询具有一组固定的列。您可以使用两个标签列来做您想做的事情:
select t1.customerid, t1.firstname, t1.lastname,
min(t2.tag) as tag1,
(case when min(t2.tag) <> max(t2.tag) then max(t2.tag)
end) as tag2
from table1 t1 left join
table2 t2
on t1.customerid = t2.customerid
group by t1.customerid, t1.firstname, t1.lastname;
如果您只是想要一个标签列表-与长度无关(最多4000个字符),则可以使用listagg()
:
select t1.customerid, t1.firstname, t1.lastname,
listagg(t2.tag, ',') within group (order by t2.id) as tags
from table1 t1 left join
table2 t2
on t1.customerid = t2.customerid
group by t1.customerid, t1.firstname, t1.lastname;
答案 1 :(得分:0)
使用ROW_NUMBER()
分析函数为table2
中的每个标签赋予每个客户一个递增的唯一编号,然后PIVOT
从行到列的输出,然后将其连接到{{1 }}:
Oracle设置:
table1
查询:
CREATE TABLE table1 ( CUSTOMER_ID, FIRSTNAME, LASTNAME ) AS
SELECT 1, 'ALICE', 'MILLER' FROM DUAL UNION ALL
SELECT 2, 'BOB', 'SMITH' FROM DUAL;
CREATE TABLE table2 ( ID, CUSTOMER_ID, TAG ) AS
SELECT 1, 1, 'PRO-CUSTOMER' FROM DUAL UNION ALL
SELECT 2, 1, 'ADMIN' FROM DUAL UNION ALL
SELECT 3, 2, 'PRO CUSTOMER' FROM DUAL;
输出:
CUSTOMER_ID | FIRSTNAME | LASTNAME | TAG1 | TAG2 | TAG3 | TAG4 ----------: | :-------- | :------- | :----------- | :----------- | :--- | :--- 1 | ALICE | MILLER | ADMIN | PRO-CUSTOMER | null | null 2 | BOB | SMITH | PRO CUSTOMER | null | null | null
db <>提琴here