0

これが私の言いたいことの具体的な例です。次のテーブルを定義しています。

CREATE TABLE pets (
    id INTEGER UNSIGNED NOT NULL,
    name VARCHAR(20) NOT NULL,
    breed VARCHAR(20) NOT NULL,
    color VARCHAR(20) NOT NULL,
    weight INTEGER UNSIGNED NOT NULL,
    PRIMARY KEY (id)
);

コッカースパニエルの色とすべて同じ色のペットを含む品種を見つける SQL クエリを作成するにはどうすればよいでしょうか? したがって、データベース内のすべてのコッカー スパニエルが黒または白の場合、少なくとも 1 頭の黒のペットと 1 頭の黄色のペットを持つすべての異なる品種を見つける必要があります。私はしばらくこれに困惑しており、オンラインで同等の回答を見つけることができなかったので、ここで助けていただければ幸いです.

4

4 に答える 4

2

いつものように、実際の RDBMS を秘密にしておくと、それが難しくなります。

CTE をサポートするデータベース (PostgreSQL、Oracle、SQL Server など) の場合

CTE:

WITH colors AS (
    SELECT DISTINCT color
    FROM   pets
    WHERE  breed = 'cocker spaniels'
    )
SELECT p.breed
FROM   colors c
JOIN   pets   p USING (color)
GROUP  BY p.breed
HAVING count(DISTINCT p.color) = (SELECT count(*) FROM color);

説明

  1. CTE のコッカー スパニエルの異なる色のセットを取得しcolorます。
  2. 同じ色のすべてのペットに参加し、品種ごとにペットをグループ化します
  3. 節で、HAVING異なる色の数がコッカー スパニエルの色の数と一致することを確認します。

エルゴ: 結果として得られるペット (コッカー スパニエルを含む) は、コッカー スパニエルが行うすべての色で提供されます。

これは関係分割の特殊なケースです。最近、この関連する質問の下にクエリの武器庫全体を集めました。


MySQL の場合

SELECT p.breed
FROM (
   SELECT DISTINCT color
   FROM   pets
   WHERE  breed = 'cocker spaniels'
   ) c
JOIN   pets p USING (color)
GROUP  BY p.breed
HAVING count(DISTINCT p.color) = (
   SELECT count(DISTINCT color)
   FROM   pets
   WHERE  breed = 'cocker spaniels'
   );

-> sqlfiddle

于 2012-10-17T01:29:23.597 に答える
0
--parameter
DECLARE @breed varchar(20)
SET @breed = 'Cocker Spaniel' 

--count distinct colors for param
DECLARE @colors int
SELECT @colors = COUNT(DISTINCT color) FROM pets WHERE breed = @breed 

--match param breed with others based on color
--return only breed with matching count of distinct colors
SELECT otherBreeds.breed
FROM
    (SELECT DISTINCT breed, color FROM pets WHERE breed = @breed) AS thisBreed
    LEFT OUTER JOIN (SELECT DISTINCT breed, color FROM pets WHERE breed <> @breed) AS otherBreeds
    ON thisBreed.color = otherBreeds.color
GROUP BY otherBreeds.breed
HAVING COUNT(DISTINCT otherBreeds.color) = @colors
于 2012-10-17T01:46:09.173 に答える
0

私の理解が正しければ、品種がすべて白またはすべて黒の品種は必要ありません。白と黒の品種のみが必要です (コッカースパニエルのさまざまな色)。それに基づいて、これが私が思いついたものです(おそらく最も効率的ではありませんが)。

DECLARE @pets TABLE(
  id INTEGER NOT NULL,
  name VARCHAR(20) NOT NULL,
  breed VARCHAR(20) NOT NULL,
  color VARCHAR(20) NOT NULL,
  weight INTEGER NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO @pets VALUES (1, 'jeff', 'breed1', 'black', 20)
INSERT INTO @pets VALUES (2, 'larry', 'breed1', 'white', 20)
INSERT INTO @pets VALUES (3, 'bob', 'breed2', 'black', 30)
INSERT INTO @pets VALUES (4, 'kevin', 'breed3', 'black', 30)
INSERT INTO @pets VALUES (5, 'jerry', 'breed3', 'white', 30)

DECLARE @breed VARCHAR(50)
SET @breed = 'breed1'
;WITH cte (color) AS (SELECT DISTINCT color FROM @pets WHERE breed = @breed)
SELECT breed, COUNT(id) FROM @pets WHERE color IN (SELECT color FROM cte)
  AND breed != @breed
GROUP BY breed
HAVING COUNT(id) >= (SELECT COUNT(*) FROM cte)

Result: breed3

CTE をサポートしていないバージョンの SQL を使用している場合は、一時テーブルまたはテーブル変数を使用して、他の品種で探す必要がある色を保持できます。うまくいけば、それは役に立ちます!

于 2012-10-17T01:25:53.703 に答える
0
SELECT  DISTINCT breeds  FROM pets 
WHERE color in (SELECT color FROM pets where name='cocker spaniels')
于 2012-10-17T01:11:30.450 に答える