如何将一张表中的几行与另一张表中的每一行合并为单独的列?

时间:2019-01-14 13:20:46

标签: sql oracle

我需要将一个表中的多行与另一张表合并为结果中的一行。我的表是这样设计的:

或类似。

有什么想法吗?给出的可用标签数量有限(<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 | 

或类似...

2 个答案:

答案 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