如何将返回的行数与SELECT-IN中的参数数匹配

时间:2012-02-09 17:30:55

标签: sql select duplicate-data ingres

我有下一个查询:

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

最后一个查询在Ingres数据库中返回2行(如果存在EMPLOYEE_ID 1和2,那么)。我如何修改此查询以使其返回4个名称,无论这些ID是否存在于EMPLOYEES表中(NULL或任何其他值),还包括那些重复2次或更多次的EMPLOYEE_ID?我已经看到了许多针对这种挑战的解决方案,但它们都不适用于SELECT IN子句。

我最终希望此查询可以帮助我构建一个包含多个记录的文本文件,其中一个员工可能出现在多个记录中;无法查询每个EMPLOYEE_ID,因为此查询将有数千个EMPLOYEE_ID,并且数据库访问当前是短暂的,连接将不会持续几分钟。

希望我已经很好地解释了自己。 -english不是我的自然语言。 问候。

2 个答案:

答案 0 :(得分:0)

最好在客户端应用所需的逻辑,但如果你想要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

答案 1 :(得分:0)

我会这样做:

假设你有一个像这样创建的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' );

将员工ID列表实现为表格:

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

请注意,如果您需要此订单,则不会保留订单,而不是添加'密钥' EMPLOYEE_LIST中的字段,并在最终的SQL语句中添加ORDER BY key

PS:SELECT IN不是一个好的选择 - 列表(1,2,1,1)在内部压缩为(1,2),即任何重复都被删除,因为它们是无关的。

有关详细信息,请参阅W3Schools.com SQL IN Operator