Oracle: объединить произвольный список с выбором из таблицы - PullRequest
0 голосов
/ 28 августа 2018

Скажем так, у меня есть таблица USERS с четырьмя пользователями:

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

Я хочу объединить его с произвольным списком атрибутов. Скажите, что мой список: «Алиса», «Боб», «Чарльз», «Дэн». Я хотел бы написать выбор, который выглядит следующим образом (чтобы затем вставить в другую таблицу).

+----+-------+-------------+
| 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.

Как я могу написать выбор, который вставляет список значений в столбец выбора, не умножая их?

1 Ответ

0 голосов
/ 28 августа 2018

Могут быть и другие способы сделать это, но один из них:

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...