Возвращать строку более одного раза в SQL из одной таблицы? - PullRequest
0 голосов
/ 17 апреля 2009

Допустим, у меня есть таблица CUSTOMERS с ключом CUSTOMER_ID. Я хотел бы вернуть несколько строк на основе запроса:

SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID in (130,130);  

Это всегда возвращает одну строку, которая соответствует, хотя я хотел бы, чтобы она появлялась дважды. Моя мотивация немного запутанная и гораздо более сложная, чем приведенный выше крошечный пример. Электронная таблица, в которую я хотел бы вырезать и вставить эту информацию, была результатом сложного объединения, к которому у меня нет доступа. В моем списке 43 тысячи записей. Я делал это в прошлом, выгружая строку в файл и зацикливая мой список ввода и выводя результаты. Есть ли хитрый SQL-трюк, который я мог бы использовать?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009

Метод 1:

Вы можете UNION ALL свой запрос к себе. Это должно удвоить ряды.

    SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID IN (130,131,...)
UNION ALL
    SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID IN (130,131,...)

Это должно сделать это. Я надеюсь, у вас есть веская причина для этого, потому что это в корне неверно.

Метод 2:

Создать фиктивную таблицу с одним столбцом и двумя строками. Присоединяйтесь к нему, без каких-либо ограничений, позволяя базе данных создавать декартово произведение:

CREATE TABLE dummy ( foo INTEGER PRIMARY KEY );
INSERT INTO dummy VALUES (1);
INSERT INTO dummy VALUES (2);

SELECT NAME FROM CUSTOMERS JOIN dummy WHERE CUSTOMER_ID IN (130,131,...)

Вы можете использовать фиктивную таблицу с набором значений 1 .. n , чтобы генерировать копии от 1 до n каждой строки, изменяя условие объединения / where.

1 голос
/ 17 апреля 2009

Вот одно из возможных решений:

SELECT c.NAME FROM CUSTOMERS c 
JOIN (SELECT 130 AS CUSTOMER_ID UNION ALL SELECT 130) x 
  USING (CUSTOMER_ID);

Обратите внимание, что синтаксис для выбора без именования таблицы зависит от поставщика. Пример выше работает в MySQL и Microsoft SQL Server, например, но не в Oracle.

Вы также можете сохранить значения 130, 130 как отдельные строки во временной таблице, а затем присоединить временную таблицу к CUSTOMERS.

1 голос
/ 17 апреля 2009

Независимо от логики, генерирующей «IN (130, 130)», можно предположить, что она легко генерирует

ВЫБЕРИТЕ ИМЯ ОТ КЛИЕНТА, ГДЕ CUSTOMER_ID = 130
ВЫБЕРИТЕ ИМЯ ИЗ КЛИЕНТОВ, ГДЕ CUSTOMER_ID = 130

, что даст вам его дважды (и, вероятно, будет проще генерировать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...