从多个表创建视图,将多行中的值组合成一行

时间:2015-09-09 18:28:39

标签: sql oracle view cursor

我有3张表格如下:

区域表:

UserID | Area
---------------
  1    | 10001
  2    | 10002
  3    | 10003

信息表:

UserID | Info
-----------------
  1    |  U1_Info1
  1    |  U1_Info2
  1    |  U1_Info3
  2    |  U2_Info1
  3    |  U3_Info1

公司表:

UserID | Company
-----------------
  1    |  ComA
  2    |  ComB
  3    |  ComC

之后,我想通过UserID进行分组。我的预期结果如下:

UserID | Area  | Info1    | Info2    | Info3    | Company
----------------------------------------------------------
  1    | 10001 | U1_Info1 | U1_Info2 | U1_Info3 | ComA
  2    | 10002 | U2_Info1 |          |          | ComB
  3    | 10003 | U3_Info1 |          |          | ComC

用户3没有Info2和Info3所以我将它们设置为'''。 我可以制作这样的视图吗?

1 个答案:

答案 0 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE Area ( UserID, Area ) AS
          SELECT 1, 10001 FROM DUAL
UNION ALL SELECT 2, 10002 FROM DUAL
UNION ALL SELECT 3, 10003 FROM DUAL;

CREATE TABLE Info ( UserID, Info ) AS
          SELECT 1, 'U1_Info1' FROM DUAL
UNION ALL SELECT 1, 'U1_Info2' FROM DUAL
UNION ALL SELECT 1, 'U1_Info3' FROM DUAL
UNION ALL SELECT 2, 'U2_Info1' FROM DUAL
UNION ALL SELECT 3, 'U3_Info1' FROM DUAL;

CREATE TABLE Company (UserID, Company ) AS
          SELECT 1, 'ComA' FROM DUAL
UNION ALL SELECT 2, 'ComB' FROM DUAL
UNION ALL SELECT 3, 'ComC' FROM DUAL;

CREATE VIEW TEST AS
SELECT A.UserID,
       MAX( A.Area    ) AS Area,
       MAX( CASE WHEN I.Info LIKE '%_Info1' THEN I.Info END ) AS Info1,
       MAX( CASE WHEN I.Info LIKE '%_Info2' THEN I.Info END ) AS Info2,
       MAX( CASE WHEN I.Info LIKE '%_Info3' THEN I.Info END ) AS Info3,
       MAX( C.Company ) AS Company
FROM   Area A
       INNER JOIN
       Company C
       ON ( A.UserID = C.UserID )
       LEFT OUTER JOIN
       Info I
       ON ( A.UserID = I.UserID )
GROUP BY
       A.UserID

查询1

SELECT * FROM test

<强> Results

| USERID |  AREA |    INFO1 |    INFO2 |    INFO3 | COMPANY |
|--------|-------|----------|----------|----------|---------|
|      1 | 10001 | U1_Info1 | U1_Info2 | U1_Info3 |    ComA |
|      2 | 10002 | U2_Info1 |   (null) |   (null) |    ComB |
|      3 | 10003 | U3_Info1 |   (null) |   (null) |    ComC |