1 @Column1 FROM @Table1 WHERE NOT EXISTS( SELECT * FROM @Table2 WHERE @Column1 = @Column2 ) ※SQL Serverの文法です ※TOP句は取得件数のlimitを指定する構文 結果が返ってきたら Table2はTable1に1件以上紐づく なければTable2はTable1に対して0件の可能性あり Table1に対して、Table2は必ず1件以上紐づくのか否かを推定する
1 Category.ID FROM Category WHERE NOT EXISTS( SELECT * FROM Goods WHERE Category.ID = Goods.CategoryID ) 例えばこのようなデータに対してクエリを実行すると... 「シューズ」に紐づくGoodsが無いのでNOT EXISTSに引っかかり、クエリ結果が1行返却される → Categoryに対してGoodsは、0件の場合もある
1 Category.ID FROM Category WHERE NOT EXISTS( SELECT * FROM Goods WHERE Category.ID = Goods.CategoryID ) 例えばこのようなデータに対してクエリを実行すると... 逆に、「シューズ」に紐づくGoodsが存在していればクエリ結果は0行となる → Categoryに対してGoodsは、1件以上紐づく ※その時点で1件以上紐付いていたというだけなので、今後もずっと必ず1件以上紐づくという断定はできない
SELECT DISTINCT TOP 1 @Column1 FROM @Table1 WHERE EXISTS( SELECT @Column2 FROM @Table2 WHERE @Column1 = @Column2 GROUP BY @Column2 HAVING COUNT(*) > 1 ) AND @Column1 IS NOT NULL ※SQL Serverの文法です ※TOP句は取得件数のlimitを指定する構文 結果が返ってきたら Table1 : Table2 = 1 : N なければ Table1 : Table2 = 1 : 1(の可能性あり)
例えばこのようなデータに対してクエリを実行すると... SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL
例えばこのようなデータに対してクエリを実行すると... SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL EXISTSに引っかかる(Goodsを2個以上保有している)Categoryが無いため、結果は0件となる
SELECT DISTINCT TOP 1 Category.ID FROM Category WHERE EXISTS( SELECT Goods.CategoryID FROM Goods WHERE Category.ID = Goods.CategoryID GROUP BY Goods.CategoryID HAVING COUNT(*) > 1 ) AND Category.ID IS NOT NULL パンツがEXISTSに引っかかる(Goodsを2個以上保有している)ため、結果は1件となる