我有下一个查询:
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不是我的自然语言。 问候。
答案 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