0

これは、NOT IN、IN、NOT EXISTS、EXISTS、ANY、ALL のセット演算子のみを使用して SQL oracle で行われます。

データベースは次のとおりです。

Department(DeptNum, Descrip, Instname, DeptName, State, Postcode)
Academic(AcNum, DeptNum*, FamName, GiveName, Initials, Title)
Paper(PaNum, Title)
Author(PaNum*, AcNum*)
Field(FieldNum, ID, Title)
Interest(FieldNum*, AcNum*, Descrip)

質問は:

誰も論文を執筆していないクイーンズランド州 (QLD または Qld) の部門の部門番号、説明、および機関名を検索します。

私の現在の試みは、どの州の出身であっても誰も論文を書いていない部門を突き止めることです

SELECT department.deptNum, department.state, department.instname
FROM department, academic
WHERE department.deptnum = academic.deptnum
  AND NOT EXISTS
    (SELECT * 
    FROM author 
    WHERE acnum = academic.acnum);

しかし、どうやらそれは1つのタプルのみを返すはずです。私は 3 1 を取得します。そのうちの 1 は QLD です。追加して他の2つを削除しようとすると

  AND department.state = 'QLD' OR department.state = 'Qld'

WHERE 句と AND NOT EXISTS の間で、結果が多すぎます。

誰でも私を解決策に導くことができますか?

4

3 に答える 3

1

ANDよりきつく結合するORので、

A and B or C

と解釈されます

(A and B) or C

いいえ

A and (B or C)

したがって、括弧を付ける必要があります。または、次を使用できますin

AND department.state IN ('QLD', 'Qld')
于 2012-10-06T13:43:31.480 に答える
1

これは間違っています:

WHERE department.deptnum = academic.deptnum 
AND department.state = 'QLD' 
OR department.state = 'Qld'

1. 最初の AND 2 番目の条件でフィルタリングされたデータ 2. "department.deptnum =cademic.deptnum" 条件なしの 3 番目の条件でフィルタリングされたデータ。

ブラケットについて考えてみましょう。

次のようにする必要があります。

WHERE department.deptnum = academic.deptnum 
AND (department.state = 'QLD' OR department.state = 'Qld')

またはこのように:

WHERE department.deptnum = academic.deptnum 
AND upper(department.state) = 'QLD'

UPPER('string') は、8i 以降のバージョンと互換性のある Oracle/PLSQL 関数であり、すべての文字を大文字に変更します。

データには「Qld」、「qld」、および「QLD」(大文字と小文字の任意の組み合わせ) が含まれる可能性があるため、最後のオプションが最適です。

データの見栄えを良くするために、ここで upper('string') を使用することもできます。

SELECT department.deptNum, upper(department.state), department.deptname

編集 - コメント#1の回答。

「NOT EXISTS」は、異なるデータ行に対しては悪い考えです。

主な選択には3つの列があります:department.deptNum、department.state、department.instname 著者によるフィルタリングに使用される選択には2つの列があります。

この解決策を試してください:

SELECT 
    department.deptNum, 
    department.state, 
    department.instname

FROM 
    department, 
    academic
WHERE 
    department.deptnum = academic.deptnum AND 
    upper(department.state) = 'QLD' AND
    (SELECT count(*) FROM author WHERE acnum = academic.acnum) = 0;
于 2012-10-06T13:45:12.130 に答える
0

他の部門を取得する方法を理解しました。

自然な結合を取り除き、すべてをバラバラに分解しました。

まず、表示する属性を部門テーブルから取得します。次に、結果を除外して、QLD/Qld のみを表示します。次に、学術テーブルへのリンクとして使用した「NOT IN」を使用し、別の「IN」セット演算子をネストして著者テーブルにリンクしました。期限が過ぎたら、完全なソリューションを投稿します。

しかし、私を助けたほとんどの唯一のことは、少しずつそれを行うことでした. 自然な結合は、私の考えをすべて混乱させました。

于 2012-10-06T15:20:58.030 に答える