1

SQLで操作する必要のある適度に大きなMSAccess.mdbファイルを使用しています。残念ながら、理論的には機能するいくつかのステートメントがハングアップするように思われ、私はレンガの壁にぶつかりました。

これがSQLFiddleの簡略化された表現です

3つのテーブル:products、product_category、およびcategories「HIDE =1」フィールドを持つアイテムのみを含むカテゴリを選択する必要がありますカテゴリにhide=0の製品が含まれている場合、選択しないでください。

サブクエリを使用するとこれを比較的簡単に実行できますが、クエリが停止します。以前は、左結合に依存するクエリは効率的に実行されるように見えましたが、このクエリをその形式に変換するのに十分な結合に頭を悩ませることはできません。

編集:

SELECT c.categoryid 
FROM product_category AS c
      LEFT JOIN
      (
          SELECT DISTINCT c.categoryid 
          FROM  product_category AS c
                LEFT JOIN products AS p 
                  ON c.catalogid = p.catalogid
          WHERE p.hide = 0
      )    y ON y.categoryid = c.categoryid

WHERE y.categoryid IS NULL

誰かが上記のクエリを回答として投稿しましたが、何らかの理由でそれを削除しました。私が知る限り、それは機能し、迅速に機能します。私はこの質問に答えられると思います。覚えていれば、タイマーが許せば答えを自己投稿します。

4

2 に答える 2

2

カタログIDごとにカテゴリIDが1つしかない場合は、個別のものを取り除くことができます:

Select
  c.id, c.categoryname
From
  category c
Where
  Not Exists (
    Select 
      'x'
    From 
      products p
        Inner Join
      product_category pc
        on pc.catalogid = p.catalogid
    Where
      pc.categoryid = c.id and
      p.hide = 0
  )

編集済み - フィドルのテスト データが間違っているようです。修正しました。これで動作するはずです

http://sqlfiddle.com/#!6/56f5e/1/0

于 2012-10-23T15:58:20.383 に答える
2

サブクエリの相関を解除するだけでよいと思います...

SELECT c.categoryid FROM product_category AS c
WHERE c.categoryid NOT IN 

(SELECT DISTINCT c1.categoryid FROM product_category AS c1
LEFT JOIN products AS p ON c1.catalogid = p.catalogid
WHERE p.hide = 0)

代わりに、サブクエリproduct_categoryテーブルにどのようにエイリアスを付けたかに注意してください。これは、メイン クエリのすべての行に対して 1 回ではなく、サブクエリが 1 回だけ実行されることを意味します。c1c

SQL フィドル

間違いなく、さらに多くの効率性が見出されることに注意してください。ただし、これで十分だと思います。

実際、ここでは LEFT JOIN は必要ありません。つまり...

SELECT c.categoryid FROM product_category AS c
WHERE c.categoryid NOT IN 

(SELECT DISTINCT c1.categoryid FROM product_category AS c1
INNER JOIN products AS p ON c1.catalogid = p.catalogid
WHERE p.hide = 0)

..これにより、速度がいくらか向上します。

于 2012-10-23T15:02:02.800 に答える