2016-11-14 2 views
0

select文を作成しようとしています。サブクエリのすべてのレコードを含むレコードを選択したい。彼らはこれらの部品のすべてを販売している場合すべてのサブクエリ結果が含まれているレコードを選択します。

SELECT P.pid 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
WHERE M.name = 'Mercedes' 

私はサプライヤーを選択する:

は、私のようなサブクエリを持っています。私はいくつかのことを試しました:

SELECT s.name 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
WHERE p1.pid IN (SELECT P.pid 
    FROM Parts P 
    INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
    WHERE M.name = 'Mercedes') 

これは明らかに失敗しました。これは、部品があればサプライヤに返します。実際に私は、INTERSECTを使用することにより近づけるために管理:

SELECT P1.pid 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
INTERSECT 
SELECT P.pid 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
WHERE M.name = 'Mercedes' 

これは正しいPIDを返しますが、この構文は私がs.nameを返却することはできません。 2番目のクエリに存在しないフィールドを追加することはできません。

答えて

1

次に、あなたは、部品数を同じにする必要があり、製造条件COUNT()

SELECT COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_mercedes 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 

を使用してみてください。

SELECT s.name, 
     COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_supplier 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
CROSS JOIN (SELECT COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_mercedes 
      FROM Parts P 
      INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
      ) M 
GROUP BY s.name 
HAVING T.total_mercedes = total_supplier 

もう1つのオプションはLEFT JOINです。

まず、メルセデスのすべてのPidとすべてのサプライヤーが必要です。次に、NULLの行があるかどうかを確認します。

SELECT S.name 
FROM (SELECT P.Pid 
     FROM Parts P 
     INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
     WHERE M.name = 'Mercedes' 
    ) M 
CROSS JOIN (SELECT DISTINCT S.name, 
      FROM Suppliers S 
      ) S 
LEFT JOIN Suppliers Sales 
     ON M.Pid = Sales.Pid 
    AND S.name = Sales.Name 
GROUP BY S.name 
HAVING COUNT(CASE WHEN Sales.Pid IS NULL THEN 1 END) = 0 
+0

@Matt 'CASE'を修正してください。しかし、どのように派生テーブルを簡略化することができないのか分かりません。LEFT JOINを実行する前に、すべての部品とサプライヤをベースにしておく必要があります。 –

+0

ああ、私はそれを見ています...最初はメーカーとの結合を使用します。 「ピッド」を持つ。 –

+0

ああ、ちょうど私がそれがないときれいだったと思ったのはどちらの方法でも大したことではない。いい答えだ – Matt

関連する問題