0

私は次の関係を持っています

Supplies            
sid     1       2       3       4
sname   Jason   David   John    Peter
address 1a      2b      3c      4d


Parts                       
pid     10      20      30      40
pname   Head    Body    Hand    Leg
color   red     blue    green   white


Catalog             
sid 1   1   2   2   3   4   1
pid 10  20  20  30  30  40  30
cost100 200 150 150 130 125 50

そして、赤と緑の部品を供給しているサプライ品の ID を見つけたいと思います。

  1. クエリを使用しましたが、null を返しましたが、その理由がわかりません。(sid is 1 を返す必要があります)

    SELECT S.sid
    FROM Suppliers AS S, Parts AS P, Catalog AS C
    WHERE S.sid = C.sid
    AND C.pid = P.pid
    AND (
    P.color =  'red'
    AND P.color =  'green'
    )
    
  2. 上記のクエリと次のクエリの違いは何ですか? (nullも返しますが、sid is 1を返すべきだと思います)

    SELECT S.sid
    FROM Suppliers AS S, Parts AS P1, Catalog AS C1, Parts AS P2 , Catalog AS C2
    WHERE S.sid = C1.sid
    AND C1.pid = P1.pid
    AND S.sid = C2.pid
    AND C2.pid = P2.pid
    AND (
    P1.color =  'red'
    AND P2.color =  'green'
    )
    
4

5 に答える 5

3

最初のクエリで:

P.colorred **AND** green同時に等しいことはできません

同じテーブルが異なるエイリアスで 2 回結合されているため、2 番目のクエリは間違っています。

于 2013-05-08T20:04:48.180 に答える
2

最初のクエリでは、赤と緑の両方のパーツを見つけようとしています。そのような行は存在できません。

2 番目のクエリでは、Parts テーブルと Catalog テーブルを 2 回結合しているため、緑色のパーツを持つ別のカタログもあるカタログで赤色のパーツを見つけようとしています。これはおそらくあなたが望むものです。

ただし、WHEREステートメントに小さな間違いがあります

WHERE S.sid = C1.sid
AND S.sid = C2.pid  <-- error is here, it should be C2.sid

このクエリを記述するよりクリーンな方法があります。速くはありませんが、読みやすくなっています。sqlfiddle はカタログという言葉を好まないため、テーブル Catalog の名前を cata に変更したことに注意してください。

select s.sid 
  from suppliers s
  join cata cr on s.sid = cr.sid
  join parts pr on pr.pid = cr.pid and pr.color = 'red'
  join cata cg on s.sid = cg.sid
  join parts pg on pg.pid = cg.pid and pg.color = 'green';

sqlfiddle

于 2013-05-08T20:10:05.780 に答える
1

おそらく一致するものが見つからないため、空の回答セットまたは「null」を返しています

回答セットに何かが得られるまで、一度に 1 つの選択基準を削除してから、その 1 つの選択基準 (動作を開始する直前に削除したもの) が一致しない理由を特定し、それに応じて変更します。 .

お役に立てれば!

于 2013-05-08T20:05:14.517 に答える
1

1. sdespontに完全に同意します。だからあなたの最初Queryをこのようなものに変更してください

SELECT S.sid
FROM Suppliers AS S
inner join Catalog AS C on C.SID=S.SID
inner join Parts AS P on P.PID=C.PID
WHERE
P.color =  'red'
AND
P.color =  'green'

2.2 つ目Query最初のものと同じ問題があります。また、同じテーブルに参加する必要はありません。twice

于 2013-05-08T20:09:46.707 に答える
1

赤の部品と緑の部品を購入できるサプライヤを見つけたいと考えています。これらのサプライヤーは両方の色を在庫しています。

cannot find errorベン図のように、サブセットが明確に区別されるようにクエリを作成すると役立つ場合があります。これは、インライン ビューで実行できます。構文は簡潔ではないように見えるかもしれませんが、簡潔な構文はパフォーマンスと相関しません。インライン ビューは、特に id リストを操作し、余分なデータを取り込まない場合に、非常にうまく機能します。

以下では、赤い部品を提供しているサプライヤの id リストと、緑色の部品を提供しているサプライヤの id リストを交差させ、必要なすべてのサプライヤ データを取得したい場合に、それを再びサプライヤー テーブルと交差させます (名前、電話番号、住所、ファックス番号、営業担当者名など)。

      select * from suppliers

           join

           (



            select redsuppliers.sid   
             from

           (
            select sid 
            from catalog join parts
            on catalog.pid = parts.pid
            where parts.color = 'red'
            ) redsuppliers

            join


           (
            select sid 
            from catalog join parts
            on catalog.pid = parts.pid
            where parts.color = 'green'
            ) greensuppliers
           on redsuppliers.sid=greensuppliers.sid



           ) as SuppliersWithBothColors

          on suppliers.sid = SuppliersWithBothColors.sid
于 2013-05-08T21:07:47.790 に答える