【问题标题】:Oracle: Combine arbitrary list with select from a tableOracle:将任意列表与从表中选择相结合
【发布时间】:2018-08-28 18:35:40
【问题描述】:

假设我有一个包含四个用户的 USERS 表:

+----+-------+
| id | login |
+----+-------+
| 1  | guest |
| 2  | admin |
| 3  | alice |
| 4  | bob   |
+----+-------+

我想将它与任意属性列表结合起来。假设我的列表是:'alice'、'bob'、'charles'、'dan'。我想写一个看起来像这样的选择(然后插入另一个表)。

+----+-------+-------------+
| id | login | friend_name |
+----+-------+-------------+
| 1  | guest | alice       |
| 2  | admin | bob         |
| 3  | alice | charles     |
| 4  | bob   | dan         |
+----+-------+-------------+

当前尝试:

SELECT u.id,
  u.name,
  vals.column_value
FROM users u
INNER JOIN TABLE(sys.odcivarchar2list('alice', 'bob', 'charles', 'dan')) vals
ON vals.column_value IS NOT NULL ;

仅,这将创建一个笛卡尔积。结果将包括每个用户的四行:

+----+-------+-------------+
| id | login | friend_name |
+----+-------+-------------+
| 1  | guest | alice       |
| 1  | guest | bob         |
| 1  | guest | charles     |
| 1  | guest | dan         |
| 2  | admin | alice       |
| 2  | admin | bob         |
| 2  | admin | charles     |
| 2  | admin | dan         |
| 3  | alice | alice       |
| 3  | alice | bob         |
| 3  | alice | charles     |
| 3  | alice | dan         |
| 4  | bob   | alice       |
| 4  | bob   | bob         |
| 4  | bob   | charles     |
| 4  | bob   | dan         |
+----+-------+-------------+

这个不起作用,但这是我想做的:

SELECT u.id,
  u.name,
  vals.column_value
FROM users u
INNER JOIN TABLE(sys.odcivarchar2list('alice', 'bob', 'charles', 'dan')) vals
ON vals.rownum = u.rownum ;

当然不行,因为两张表都没有rownum属性。

如何编写一个 select 将值列表插入到 select 的列中而不将它们相乘?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    可能还有其他方法可以做到这一点,但一种方法是:

    SELECT u.id, u.name, vals.column_value
    FROM (SELECT u.*, rownum as seqnum
          FROM users u
         ) u JOIN
         (SELECT vals.*, rownum as seqnum
          FROM TABLE(sys.odcivarchar2list('alice', 'bob', 'charles', 'dan')) vals
         ) vals
         ON vals.rn = u.rn ;
    

    【讨论】:

    • 这正是我需要做的,谢谢 Gordon!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2013-11-23
    相关资源
    最近更新 更多