0

インターンシップに応募できるインターンの応募があります。インターンを自動的に資格認定するスクリプトがあります。どのインターンシップにも参加する資格がないインターン生を全員集めたいです。

データベースは次のようになります。

 Intern (Id,...)
 Application (Id, status, intern_id, internship_id,...)
 Internship (Id,...)

ステータスには、「適用済み」、「認定済み」、「現在」、「完了」があります。基本的には、「認定済み」ステータスのアプリケーションを持っていないインターンの参加リクエストを行う必要がありますが、私の SQL スキルはかなり基本的なものです.

編集

インターンには複数の応募がある可能性があることを忘れていました.インターンは1つのインターンシップにのみ資格を得ることができますが、彼はまだ別のインターンシップに応募している可能性があるため、これはうまくいきません.

SELECT *
FROM Intern i
INNER JOIN Application a ON i.Id = a.intern_id
WHERE a.status <> 'qualified'
4

4 に答える 4

1
SELECT *
  FROM Intern i
 WHERE NOT EXISTS
    (SELECT *
       FROM Intern j
          , Application a
      WHERE j.id = a.intern_id
        AND i.id = j.id
        AND a.status = 'qualified')
于 2012-06-19T15:43:51.863 に答える
1

にステータスを含め、次のLEFT JOINように一致しないものをフィルタリングします。

SELECT  ....
FROM    Intern i
        LEFT JOIN
                Application a
                ON i.Id = a.intern_id
                AND a.status = 'qualified'
WHERE   a.Id IS NULL

明らかに、列のリストを置き換えてください!

于 2012-06-19T15:43:52.633 に答える
0
SELECT * FROM Intern
WHERE Id IN ( SELECT Intern_id FROM Application WHERE status <> 'qualified' );
于 2012-06-19T15:44:32.073 に答える
0

このクエリは、探しているものを返す必要があります。

SELECT *
FROM Intern i
INNER JOIN Application a ON i.Id = a.intern_id
WHERE a.status <> 'qualified'

明らかに、* を探しているフィールドだけに置き換えることができます。資格がないインターンを探しているのであれば、インターンシップ テーブルは必要ないと思います。これは、インターンごとに 1 つのアプリケーションしかないことを前提としています...そうでない場合は、次のクエリを使用できます。

SELECT *
FROM Intern i
WHERE i.Id IN
(
 SELECT intern_id
 FROM Application a
 WHERE a.status <> 'qualified'
)
于 2012-06-19T15:46:10.760 に答える