0

会社名と製品名が関係の主キーであると仮定すると、このクエリで会社名を繰り返すことができない理由がわかりません。

     SELECT  Company.name
     FROM    Company, Product
     WHERE   Company.name=Product.maker
              AND  Product.name  IN
                         (SELECT Purchase.product
                           FROM   Purchase
                           WHERE Purchase.buyer = ‘Joe Blow‘);

S 社が 2 つの製品 X、Y を製造し、その両方を Joe Blow が購入した場合、最初に条件「Company.name=Product.maker」のデカルト積を作成します: SX、SY、両方の Product.name は計算するセットでは、したがって S を 2 回出力する必要があります。

4

3 に答える 3

1

テーブル構造やエラー メッセージが表示されないと、何が問題なのかわかりません。あなたの構文は正しいようです。

ただし、より適切な結合を使用することで、クエリを改善できます。

SELECT
    c.name
FROM
    Company c
    INNER JOIN Product prod
        ON c.name = prod.maker
    INNER JOIN Purchase pch
        ON prod.name = pch.product
WHERE
    pch.buyer = 'Joe Blow'

テーブルがどのように結合されているかが正確に明確になるため、暗黙的な結合 (カンマ区切りのテーブルと句内INNER JOINON結合条件) の代わりに明示的な結合 (結合条件付き) を使用することをお勧めします。WHERE

于 2013-06-28T12:26:24.610 に答える
1

RDBMS の大部分では、クエリは 2 つの「S」を返します。

ここで自分で試すことができますSQL FIDDLE

重複しないように個別に配置できます

 SELECT  distinct Company.name
 FROM    Company, Product
 WHERE   Company.name=Product.maker
          AND  Product.name  IN
                     (SELECT Purchase.product
                       FROM   Purchase
                       WHERE Purchase.buyer = 'Joe Blow')
于 2013-06-28T12:29:07.240 に答える
0

会社と製品を返すクエリから会社名を射影したため、2 つの S を返しても問題ありません。このクエリの各行は一意ですが、一部の列を射影すると一意ではないか、DISTINCT を使用できます。

于 2013-06-28T12:48:00.100 に答える