【问题标题】:Select union table from same table based on key with oracle使用oracle根据键从同一张表中选择联合表
【发布时间】:2015-04-22 08:55:05
【问题描述】:

我需要你的帮助。我想union 来自同一个表的数据,基于第二个表,带有 oracle SQL。

表 1

id | au_id | data
------------------
1  | 33    | foo
2  | 44    | foo
3  | 34    | foo
4  | 55    | foobar
5  | 55    | fooo

表 2

au_id | follow_au_id
-----------------------
33    | 55

结果

au_id | data
----------------
33    | foo
33    | foobar
33    | fooo
44    | foo
34    | foo
55    | foobar
55    | fooo

【问题讨论】:

    标签: sql oracle union


    【解决方案1】:
    select au_id, data from tbl
    union all
    select t2.au_id, t1.data from tbl t1 join tbl t2 on t1.au_id = t2.follow_au_id
    

    SQLFiddle

    【讨论】:

      【解决方案2】:

      你必须使用join

      select t1.au_id, t3.data 
      from table1 t1 
        join table2 t2 on t1.au_id=t2.au_id 
        join table1 t3 on t2.follow_au_id = t3.au_id
      union     
      select t1.au_id, t1.data 
      from table1 t1 
      

      【讨论】:

        【解决方案3】:

        你需要一个JOIN和一个UNION

        SELECT t.*
        FROM
          ( SELECT t1.au_id, t1.data FROM table1 t1
          UNION ALL
          SELECT t2.au_id,
            t1.data
          FROM table1 t1
          JOIN table2 t2
          ON t1.au_id = t2.follow_au_id
          ) t
        ORDER BY t.au_id
        /
        

        感谢@notulysses 指出,这是一个不正确的外连接解决方​​案。看到这个SQL Fiddle

        正确的解决方法如下:

        例如,

        设置

        SQL> CREATE TABLE Table1
          2      (id int, au_id int, data varchar2(6))
          3  ;
        
        Table created.
        
        SQL>
        SQL> INSERT ALL
          2      INTO Table1 (id, au_id, data)
          3           VALUES (1, 33, 'foo')
          4      INTO Table1 (id, au_id, data)
          5           VALUES (2, 44, 'foo')
          6      INTO Table1 (id, au_id, data)
          7           VALUES (3, 34, 'foo')
          8      INTO Table1 (id, au_id, data)
          9           VALUES (4, 55, 'foobar')
         10      INTO Table1 (id, au_id, data)
         11           VALUES (5, 55, 'fooo')
         12  SELECT * FROM dual
         13  ;
        
        5 rows created.
        
        SQL>
        SQL> CREATE TABLE Table2
          2      (au_id int, follow_au_id int)
          3  ;
        
        Table created.
        
        SQL>
        SQL> INSERT ALL
          2      INTO Table2 (au_id, follow_au_id)
          3           VALUES (33, 55)
          4  SELECT * FROM dual
          5  ;
        
        1 row created.
        
        SQL>
        

        查询

        SQL> SELECT t.*
          2  FROM
          3    ( SELECT t1.au_id, t1.data FROM table1 t1
          4    UNION ALL
          5    SELECT t2.au_id,
          6      t1.data
          7    FROM table1 t1
          8    JOIN table2 t2
          9    ON t1.au_id = t2.follow_au_id
         10    ) t
         11  ORDER BY t.au_id
         12  /
        
             AU_ID DATA
        ---------- ------
                33 foobar
                33 fooo
                33 foo
                34 foo
                44 foo
                55 fooo
                55 foobar
        
        7 rows selected.
        
        SQL>
        

        【讨论】:

        • 实际上,您的查询是错误的——至少计算行数。
        猜你喜欢
        • 2020-04-08
        • 2011-04-03
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2020-12-11
        • 1970-01-01
        相关资源
        最近更新 更多