Как сопоставить количество возвращаемых строк с количеством аргументов внутри SELECT-IN - PullRequest
0 голосов
/ 09 февраля 2012

У меня следующий запрос:

SELECT EMP.NAME FROM EMPLOYEES EMP WHERE EMP.EMPLOYEE_ID IN (1, 2, 1, 1)
ORDER BY EMP.EMPLOYEE_ID; 

Этот последний запрос возвращает 2 строки в базе данных Ingres (если существуют EMPLOYEE_IDs 1 и 2, то есть).Как мне изменить этот запрос, чтобы он возвращал 4 имени, независимо от того, существуют эти идентификаторы в таблице EMPLOYEES или нет (NULL или любое другое значение), а также те EMPLOYEE_ID, которые повторяются 2 или более раз?Я видел много решений для такого рода задач, но ни одно из них не применимо к предложению SELECT IN.

В конечном итоге я хочу, чтобы этот запрос помог мне в создании текстового файла с несколькими записями, где сотрудник может отображаться в нескольких записях;Я не могу позволить себе запрашивать каждый EMPLOYEE_ID, потому что этот запрос будет иметь тысячи EMPLOYEE_ID, а доступ к базе данных в настоящее время эфемерный, соединение не будет удерживаться, но пару минут.

Надеюсь, я все объяснил достаточно хорошо.-английский не мой естественный язык.Привет.

Ответы [ 2 ]

0 голосов
/ 04 августа 2014

Я сделаю это так:

Предположим, у вас есть таблица Employee, созданная следующим образом:

CREATE TABLE EMPLOYEES ( EMPLOYEE_ID INTEGER NOT NULL, name CHAR(10) NOT NULL );
INSERT INTO EMPLOYEES ( EMPLOYEE_ID, name ) VALUES ( 1, 'John' );
INSERT INTO EMPLOYEES ( EMPLOYEE_ID, name ) VALUES ( 2, 'Victoria' );

Реализация списка идентификаторов сотрудников в виде таблицы:

CREATE TABLE EMPLOYEE_LIST ( EMPLOYEE_ID INTEGER NOT NULL );
INSERT INTO EMPLOYEE_LIST ( EMPLOYEE_ID ) VALUES ( 1 );
INSERT INTO EMPLOYEE_LIST ( EMPLOYEE_ID ) VALUES ( 2 );
INSERT INTO EMPLOYEE_LIST ( EMPLOYEE_ID ) VALUES ( 1 );
INSERT INTO EMPLOYEE_LIST ( EMPLOYEE_ID ) VALUES ( 1 );

Затем создайте окончательный список как объединение:

SELECT b.EMPLOYEE_ID, b.name 
from EMPLOYEE_LIST a
INNER JOIN EMPLOYEES b on (a.EMPLOYEE_ID = b.EMPLOYEE_ID)

+-------------+------------+
| employee_id |    name    |
+-------------+------------+
|           1 | John       |
|           1 | John       |
|           1 | John       |
|           2 | Victoria   |
+-------------+------------+

Обратите внимание, что порядок не сохраняется, если вам это нужно, чем добавить поле 'key' в EMPLOYEE_LIST и добавить ORDER BY key вокончательный оператор SQL

PS: SELECT IN не является хорошим вариантом - список (1, 2, 1, 1) внутренне сжимается как (1, 2), т. е. любые дубликаты удаляются, поскольку они не имеют значения.

Подробнее см. Оператор SQL IN W3Schools.com

0 голосов
/ 09 февраля 2012

Лучше применить желаемую логику на стороне клиента, но если вы хотите решение sql, вы можете использовать UNION ALL

SELECT * FROM 
(
SELECT EMP.NAME FROM EMPLOYEES EMP WHERE  EMP.EMPLOYEE_ID  = 1
UNION ALL 
SELECT EMP.NAME FROM EMPLOYEES EMP WHERE  EMP.EMPLOYEE_ID  = 2
UNION ALL 
SELECT EMP.NAME FROM EMPLOYEES EMP WHERE  EMP.EMPLOYEE_ID  = 1
UNION ALL 
SELECT EMP.NAME FROM EMPLOYEES EMP WHERE  EMP.EMPLOYEE_ID  = 1
)a 
ORDER BY EMPLOYEE_ID

Вы также можете сделать

SELECT b.* 
FROM 
(SELECT 1 AS EMPLOYEE_ID -- FROM DUAL - if you use Oracle
 UNION ALL
 SELECT 2
 UNION ALL
 SELECT 1
 UNION ALL
 SELECT 1
)a
LEFT JOIN EMPLOYEES b ON (b.EMPLOYEE_ID = a.EMPLOYEE_ID)
ORDER BY a.EMPLOYEE_ID
...