Скажем так, у меня есть таблица 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.
Как я могу написать выбор, который вставляет список значений в столбец выбора, не умножая их?