0

私はこれを理解するために過去1時間試みてきました。

部門 10 と 30 に所属する従業員と、その勤務場所を確認する必要があります。従業員名と部門番号をリストする従業員用のテーブルと、場所と部門番号である部門テーブルがあります。

これが私が試したものです:

SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS, EMPLOYEES
WHERE Employees.DeptNo IN (10, 30)
Order BY Location ASC;

結果は厄介です。たとえば、入力したデータがこれを反映していない場合、複数の都市の従業員がリストされます。

4

4 に答える 4

1

問題は、デカルト積を生成していることです。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;
于 2012-11-19T21:41:58.387 に答える
0

これを試して:

SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS JOIN EMPLOYEES ON (Departments.DeptNo = Employees.DeptNo)
WHERE Employees.DeptNo IN (10, 30)
Order BY Location ASC;
于 2012-11-19T21:41:58.463 に答える
0

テーブルを primary-foreign と結合しなかったため、デカルトの結果が得られました。

SELECT Departments.Location, Departments.DeptNo, Employees.Ename
FROM DEPARTMENTS, EMPLOYEES
WHERE Employees.DeptNo IN (10, 30)
AND   Employees.DeptNo = DEPARTMENTS.DeptNo -- <-------
Order BY Location ASC;
于 2012-11-19T21:42:58.613 に答える
0

今はちょっと無意味ですが、コメントは楽しいです:

元の要件

Select
  Count(*)
From
  Employees e
Where
  e.DeptNo In (10, 30)

要件の明確化

Select
  *
From
  Employees e
Where
  e.DeptNo In (10, 30)

結合について何かを学んだのは良いことですが、これに答えるためにまだそれらを必要としていないようですか? 彼らの場所も必要だと言うのは今だけですか?私と私の超能力をくそー。別の回答をコピーしないように。(実際には使用しないでください)

Select
  (select
     d.location 
   from
     departments d 
   where
     d.deptno = e.deptno
  ) as Department,
  e.*
From
  Employees e
Where
  e.DeptNo In (10, 30)

まだ結合していないように見えます! (あまり)

http://sqlfiddle.com/#!2/5e266/7

于 2012-11-19T21:44:26.597 に答える