1

結合除外で sql リクエストを作成しようとしています。説明します:

表要素

id # name #
 1  Sea
 2  tree

テーブルの色

id # name #
 1    green
 2    blue
 3    brown

テーブル関係

element_id # colour_id
     1           2
     2           1
     2           3

「これらの色のいずれかの要素を取得する」という作業要求があります。緑と青の例:

SELECT element.name, colour.name FROM element
LEFT JOIN relation 
  ON (element.id = relation.element_id)
LEFT JOIN colour
  ON (colour.id = relation.colour_id)
WHERE (relation.colour_id = 1 OR relation.colour_id = 2)

「リストされているすべての色と関係がある要素を取得してください」とリクエストしてください。茶色の場合はtreeを返します。

「OR」を「AND」に変更しようとしましたが、リクエストは 0 の結果を返します:/

4

4 に答える 4

2

この問題を解決する一般的な方法は、値をフィルタリングし、それらが結果に表示される回数を数えることです。等しい場合、すべての要素が見つかります。

select element_id
from relation
where colour_id in (1, 2)
group by element_id
having count (distinct colour_id) = 2

このテーブルを元のテーブルに結合して、完全な列セットを生成できます。

SELECT element.name, colour.name 
  FROM relation 
  INNER JOIN
  (
    select element_id
      from relation
     where colour_id in (1, 2)
     group by element_id
    having count (distinct colour_id) = 2
  ) matches
    ON relation.element_id = matches.element_id
  INNER JOIN element
     ON element.id = relation.element_id
  INNER JOIN colour
     ON colour.id = relation.colour_id
于 2012-04-24T19:10:13.753 に答える
0

このタイプのクエリは、SQLのセットベースの演算子の一部で処理できます。

どの要素がすべての色に関係していますか?

ALL演算子の使用(構文はデータベースによって若干異なる場合があります):

SELECT element.name
FROM element
WHERE ( SELECT colour.id FROM relation 
      INNER JOIN colour ON colour.id = relation.colour_id
      WHERE relation.element_id = element.id )
= ALL ( SELECT colour.id from colour)
;

EXCEPT演算子の使用:

SELECT element.name
FROM element
WHERE NOT EXISTS 
( SELECT colour.id from colour
   EXCEPT
  SELECT colour.id FROM relation 
  INNER JOIN colour ON colour.id = relation.colour_id
  WHERE relation.element_id = element.id 
)
;
于 2012-04-24T19:19:00.423 に答える
0

句にタイプミスがありますWHERE。ID の 1 つが 3 (「茶色」) ではなく 2 (「青」) です。そのはず

WHERE (relation.colour_id = 1 OR relation.colour_id = 3)

(または短い形式で:

WHERE relation.colour_id IN (1, 3)

)。

ただし、現在のクエリは、この修正後はサンプル データに対して機能するはずですが、通常は正しい結果が得られないことに注意してください。指定された色のいずれかに関連付けられた要素が表示されます。ただし、これに対する正しい解決策は@Nikolaの回答にあります。

于 2012-04-24T19:09:01.363 に答える
0

サブセレクトなしで、私はお勧めします:

SELECT
    e.id AS id
FROM
    element AS e
    LEFT OUTER JOIN relation AS r ON r.element_id = e.id
    GROUP BY e.id HAVING SUM(CASE WHEN r.colour_id = 1 THEN 1 ELSE 0 END ) = 0
ORDER BY e.id ASC;

この後、ID で要素を選択できます。

于 2015-10-02T14:45:52.653 に答える