0

我有下一个查询:

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 不是我的自然语言。问候。

4

2 回答 2

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 中添加“键”字段并ORDER BY key在最终 SQL 语句中添加

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

有关更多详细信息,请参阅W3Schools.com SQL IN 运算符

于 2014-08-04T13:32:03.703 回答
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
于 2012-02-09T17:37:01.907 回答