2017-12-03 14 views
0

(P_CITY)プロジェクトと同じ都市(クエリの出力を表示)に格納されているパーツのみを受け取ったプロジェクトのプロジェクト番号(PR_NO)をリストします。SQLで正しい答えがありません

表:EMP 主キー:E_NO

E_NO E_NAME E_RATE E_DEPT 
1   A $400.00 
2   B $200.00 1 
3   C $150.00 2 
4   D $150.00 3 
5   E $120.00 1 
6   F $100.00 1 
7   G $100.00 2 
8   H $50.00 2 
9   I $50.00 3 
10   J $50.00 3 
11   K $150.00 3 

表:PART 主キー:P_NO

P_NO P_NAME P_CITY 
1   P1 NY 
2   P2 NY 
3   P3 LA 
4   P4 SF 
5   P5 LA 
6   P6 NY 

表:PROJECT 主キー:PR_NO

PR_NO PR_MGR PR_DEPT PR_LOC 
1   2   1  NY 
2   3   2  LA 
3   2   1  NY 

表:サプライヤ 主キー:S_NO

S_NO S_NAME S_LOC 
1   S1 NY 
2   S2 NY 
3   S3 LA 

表:SUPPLY

Primary Key: P_NO + PR_NO + S_NO 
Foreign Key: P_NO references PART 
Foreign Key: PR_NO references PROJECT 
Foreign Key: S_NO references SUPPLIER 

P_NO PR_NO S_NO QTY 
1   1 1  111 
1   1 2  112 
1   1 3  113 
1   2 1  121 
1   2 2  122 
1   2 3  123 
1   3 1  131 
1   3 2  132 
1   3 3  133 
2   1 1  211 
3   1 1  311 
4   1 1  411 
5   1 1  511 
6   1 1  611 

表:WORK

Primary Key: E_NO + PR_NO 
Foreign Key: E_NO references EMP 
Foreign Key: PR_NO references PROJECT 
E_NO PR_NO HRS 
2   1 10 
3   2 20 
5   1 20 
5   2 20 
5   3 20 
6   1 10 
6   2 10 



select distinct P.PR_NO 
from PROJECT P, PART PA 
where PA.P_CITY = P.PR_LOC; 

正しい答えの質問は次のようになります。

PR_NO 
3 

これは誤りであります:

PR_NO 
    1 
    3 
    2 
+1

ヒント:2つのキーに 'join'する必要があります。 –

+3

結果が「3」のみであると思われる理由を説明してください。 –

+1

"部品を受け取っただけです" - 3番目のテーブルがあるはずです。 –

答えて

0

クエリの主な問題は、フィルタリングする前に2つのテーブルPROJECTとPARTを正しく結合する必要があることです。この場合、SUPPLYテーブルを使用する必要があります。

SELECT DISTINCT S.PR_NO 
    FROM SUPPLY S 
    INNER JOIN PROJECT PR 
    ON S.PR_NO = PR.PR_NO 
    INNER JOIN PART P 
    ON S.P_NO = P.P_NO 
    WHERE PR.PR_LOC = P.P_CITY 
    AND S.PR_NO NOT IN (SELECT DISTINCT S.PR_NO 
         FROM SUPPLY S 
         INNER JOIN PROJECT PR 
         ON S.PR_NO = PR.PR_NO 
         INNER JOIN PART P 
         ON S.P_NO = P.P_NO 
         WHERE PR.PR_LOC <> P.P_CITY); 

希望します。このタスクを達成するために

+0

「プロジェクトと同じ都市に(P_CITY)に保存されている部品のみを受け取った**」の「のみ」に注意してください。 –

+0

あなたは私の質問を正しく調整しました。ありがとう。 –

+0

私はクエリを修正しましたが、今はうまくいくはずです! –

1

、あなたはまた、次のようにSupplyテーブルを使用する必要があります。

select s.pr_no 
from supply s 
inner join part p 
on p.p_no = s.p_no 
group by s.pr_no 
having max(p.p_city) = min(p.p_city) 
and min(p.p_city) = (select pr_loc 
         from project 
         where pr_no = s.pr_no 
         ) 
+0

これは一部のRDBMSで動作する可能性がありますが、 'p。GROUP BYにはリストされていないので、HAVING句の中の「p_city」を参照してください。しかし、あなたは 'max(p.p_city)= ...'のようなものでこの問題を回避することができます。 –

+0

@PaulSpiegelここでは、提供された(受け取った)パーツは、1か所からのみであることを確認したいと考えています。仰るとおりです。私はそれを 'max(p.p_city)= min(p.p_city)'で調べるべきです。私は正しい? –

+0

まあ、 'count(distinct p.p_city)= 1'のために都市が1つしかないことはわかっています(あなたの編集は何も変わりません)。しかし、RDBMSは通常、私たちのようにスマートではありません;-)それで 'p.p_city'(どこに複数の行がありますか)を読む場所を知らないと不平を言うでしょう。しかし、われわれは知っているので、都市が1つしかない場合は、エラーを避けるために 'min()'または 'max()'を使うことができます。だから私はその部分を意味します: 'とmin(p.p_city)=(select pr_loc ...)' –

0

私はあなたの例のデータでこのクエリをテストし、期待どおりにプロジェクト#3を返します。

SELECT DISTINCT S.PR_NO 
FROM 
    SUPPLY S 
    INNER JOIN PROJECT PR 
     ON S.PR_NO = PR.PR_NO 
    INNER JOIN PART P 
     ON S.P_NO = P.P_NO 
WHERE 
    PR.PR_LOC = P.P_CITY AND 
    NOT S.PR_NO IN 
     (
      SELECT S2.PR_NO 
      FROM 
       SUPPLY S2 
       INNER JOIN PROJECT PR2 
        ON S2.PR_NO = PR2.PR_NO 
       INNER JOIN PART P2 
        ON S2.P_NO = P2.P_NO 
      WHERE PR2.PR_LOC <> P2.P_CITY 
     ) 

SUPPLYテーブルは、PARTとPROJECTの間のリンクを作成します。メインクエリは、プロジェクトと同じ都市に格納されている部品を検索します。 where句のサブセットは、異なる都市に格納されている部品を探すことを除いて、ほとんど同じです。このような都市のプロジェクトはNOT S.PR_NO IN (...)で除外されます。

関連する問題