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 が存在する場合)。これらの ID が EMPLOYEES テーブルに存在するかどうか (NULL またはその他の値) に関係なく、2 回以上繰り返される EMPLOYEE_ID を含めて、4 つの名前を返すようにするには、このクエリをどのように変更する必要がありますか? この種の課題に対する多くの解決策を見てきましたが、どれも SELECT IN 句には適用されません。

最終的にこのクエリが役立つのは、従業員が複数のレコードに表示される複数のレコードを含むテキスト ファイルを作成する場合です。このクエリには数千の EMPLOYEE_ID があり、データベースへのアクセスは現在一時的であり、接続は数分しか保持されないため、各 EMPLOYEE_ID をクエリする余裕はありません。

私が自分自身を十分に説明したことを願っています。- 英語は私の自然言語ではありません。ご挨拶。

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

ORDER BY keyEMPLOYEE_LIST に「キー」フィールドを追加し、最後の 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 に答える