3

私はまだ SQL ステートメントの学習段階にあり、誰かが助けてくれることを願っています。

多対多のデー​​タベース ベースの関係があります。

テーブル Department には複数の Job を関連付けることができ、Job は複数の Department に関連付けることができます。だから私はこの基本的な関係タイプを持っています。

Job.ID (one-to-many) Jobs.JobID
Jobs.DepartmentID (many-to-one) Department.ID

私がやろうとしているのは、部門にまだ関連付けられていないジョブのリストを取得することです。

tbl=Job
ID  Job     Active
1   10-3242  Yes
2   12-3902  Yes
3   12-3898  Yes

tbl=Jobs
ID  DepartmentID    JobID
1        3            1
2        3            2

tbl=Department
ID  Department
1   Administration
2   Sales
3   Production

クエリ:

string sql = "SELECT Job FROM (Job " +
    "INNER JOIN Jobs ON Job.ID = Jobs.JobID) " +
    "INNER JOIN Department ON Jobs.DepartmentID = Department.ID " +
    "WHERE Department.Department <> 'Production'";

ジョブコード12-3898が返されることを期待していますが、明らかに何かを忘れています。

どんな援助も素晴らしいでしょう。乾杯。

4

3 に答える 3

2

を使用できますLEFT JOIN。このLEFT JOINキーワードは、左側のテーブルからすべての行を返し、右側のテーブルの一致する行を返します。一致がない場合、結果はNULL右側にあります。一致する部門のないジョブが必要なため、結合DepartmentIDされているかどうかを確認できNULLます。

SELECT Job.Job
FROM   Job LEFT JOIN Jobs ON Job.ID = Jobs.JobID
WHERE  Jobs.DepartmentID IS NULL;

このデモをチェックしてください。それが機能するかどうか教えてください。

于 2013-07-10T00:10:04.820 に答える
0
select  job
from    job
where   id not in   (select jobId
                    from    jobs)
于 2013-07-10T00:10:19.937 に答える
0

残念ながら、私は結果をテストできる環境にありません。ただし、この背後にある基本的な考え方は、別のテーブルから一致する行を持たないテーブルから行を返したいときはいつでも、外部結合を行う必要があるということです。意図は、ジョブ テーブルのすべての行を表示することです (つまり、左外部結合)。ただし、NULL の departmentID は、部門テーブルの一致する departmentID を持たないジョブ テーブルの行になるため、departmentID が NULL である場所をフィルター処理する必要があります。それが役立つことを願っています。

SELECT j.id, j.job, j.active, jd.departmentid
FROM job j
LEFT OUTER JOIN jobs jd ON j.id = jd.jobid
LEFT OUTER JOIN department d ON d.id = jd.departmentid
WHERE jd.departmentid IS NULL
于 2013-07-10T00:29:56.263 に答える