3

私はjobテーブルとテーブルを持っていvisitます。ジョブは複数の訪問を持つことができます。有給として設定されていないすべての仕事を取得し、その仕事に関連付けられたすべての訪問を完了として取得する必要があります。

基本的に、次の場合にのみジョブを取得する必要があります。

  • 支払われていない(paid = 'N')
  • そのジョブに関連付けられたすべての訪問が完了として設定されます(status = 2)

明らかに、次のことを行うと、次のような結果が返されるため機能しませんjob.paid = 'N' and visit.status = '2'

SELECT * 
FROM   job INNER JOIN visit 
       ON job.id = visit.job_id 
WHERE  job.paid = 'N' AND 
       visit.status = 2;

結果を取得し、追加のクエリを実行して、ジョブのすべての訪問が完了したことを確認できますが、単一のクエリでデータを取得できるかどうか疑問に思っていました。

4

4 に答える 4

1
SELECT * 
FROM job j 
WHERE j.paid = 'N' AND 
  NOT EXISTS (SELECT 1 FROM visit WHERE job_id = j.id AND visit.status <> 2);
于 2013-04-26T14:51:39.420 に答える
1

更新 1

SELECT  a.ID  -- <<== add some columns here
FROM    job a INNER JOIN visit b ON a.id = b.job_ID
WHERE   a.paid = 'N'
GROUP   BY a.ID
HAVING  COUNT(DISTINCT b.Status) = 1 AND MAX(b.status) = 2
于 2013-04-26T14:51:59.907 に答える
1
SELECT * FROM job WHERE paid = 'N' AND id NOT IN (
SELECT job_id FROM visit WHERE status != 2)
于 2013-04-26T14:53:31.757 に答える
1

訪問レコードが関連付けられていない Job の可能性があり、その Job レコードが支払済みの場合は引き続きその Job レコードを返したい場合は、= 'N' を左結合します。

SELECT * 
FROM JOB j
LEFT JOIN VISIT v
ON j.id = v.job_id
WHERE j.paid = 'N'
AND j.id NOT IN (SELECT job_id FROM visit WHERE status != 2)
于 2013-04-26T14:53:48.183 に答える