2012-02-09 8 views
0

内の引数の数に返される行の数と一致するように、私は次のクエリを持っている:がどのようにSELECT-IN

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

EMPLOYEE_IDs 1と2が存在する場合は、この最後の問い合わせは(Ingresデータベース内の2行を返します、あれは)。これらのIDがEMPLOYEES表に存在するかどうかにかかわらず(NULLまたは他の値)、2回以上繰り返されるEMPLOYEE_IDを含めて、4つの名前を戻すには、この問合せをどのように変更する必要がありますか?私はこの種の挑戦のための多くの解決策を見てきましたが、SELECT IN節にはそれらのどれも適用されません。

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

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

+1

**もし**あなたのアールを参照してくださいアプリケーションは、これらの懸念に対処していて、クエリが単に「かどうかに基づいて、予選データ –

答えて

0

これは、クライアント側で必要なロジックを適用する方が良いですが、あなたは、SQLソリューションをしたい場合、あなたはまた、

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

の取得を心配しましょうそれらのIDはEMPLOYEESテーブルに存在するかどうかはわかりません」と私は正しい答えはあなたの第二の選択肢だと思うが、LEFT JOINを使う。 SQLの方言に応じて、 'UNION ALL'は' VALUES'を使って書く方が良いかもしれませんが、すべてのデータベースがそれをサポートしているわけではありません。Ingresは分かりません。 – hvd

+0

@hvd:ええ、そうです、私はそれを逃した。ありがとう、固定 – a1ex07

+0

おかげでみんな、私はこれを試してみるとテストの後に戻ってくる – carlsLobato

0

を行うことができます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 

使用することができます私はこのようにそれを行います:

このように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文で

PS ORDER BY keyを追加:良い選択肢ではないのSELECT - リスト(1、2、1、1)の内部に圧縮されます(1、2)すなわち〜重複は無関係なので削除されます。詳細については

、アプリケーションからこのデータを使用してW3Schools.com SQL IN Operator