問題は、デカルト積を生成していることです。JOIN
既存のクエリには、2 つのテーブル間に条件がありません。JOIN
テーブルが必要です:
SELECT d.Location, d.DeptNo, e.Ename
FROM DEPARTMENTS d
INNER JOIN EMPLOYEES e
on d.deptno = e.deptno
WHERE e.DeptNo IN (10, 30)
Order BY Location ASC;
JOIN
構文を学習するのに助けが必要な場合は、ここで join の優れた視覚的な説明を参照してください。
デモで SQL Fiddle を参照してください
内部結合結果:
| LOCATION | DEPTNO | ENAME |
-----------------------------
| Loc2 | 10 | emp2 |
| Loc2 | 10 | emp3 |
| Loc3 | 30 | emp6 |
| Loc3 | 30 | emp4 |
| Loc3 | 30 | emp5 |
JOIN
構文を使用していないデカルト クエリは、次のような結果を生成します ( SQL Fiddle with Demoを参照)。
| LOCATION | DEPTNO | ENAME |
-----------------------------
| Loc1 | 1 | emp6 |
| Loc1 | 1 | emp4 |
| Loc1 | 1 | emp2 |
| Loc1 | 1 | emp5 |
| Loc1 | 1 | emp3 |
| Loc2 | 10 | emp3 |
| Loc2 | 10 | emp6 |
| Loc2 | 10 | emp4 |
| Loc2 | 10 | emp2 |
| Loc2 | 10 | emp5 |
| Loc3 | 30 | emp3 |
| Loc3 | 30 | emp6 |
| Loc3 | 30 | emp4 |
| Loc3 | 30 | emp2 |
| Loc3 | 30 | emp5 |
間にコンマを使用する場合は、句に結合条件を含める必要があります。これにより、バージョンWHERE
と同じ結果が生成されます。INNER JOIN
select d.Location, d.DeptNo, e.ename
from departments d, employees e
WHERE e.DeptNo IN (10, 30)
and d.deptno = e.deptno
Order BY Location ASC;