2

結果を返さない 2 つのテーブルにまたがる SELECT クエリがあり、その理由がわかりません。これは、行を返さないクエリです。

SELECT b.name, b.description, b.badge_id 
FROM badges AS b 
WHERE b.type = 'have' AND b.brand_id = 'zTR7wH5FMl' AND ISNULL(b.series_id) AND b.amount <= 89 
AND NOT EXISTS (SELECT date_earned 
                FROM users_badges AS ub 
                WHERE ub.user_id = 'fMcBBx' AND ub.badge_id = b.badge_id)

最後に AND NOT EXISTS 句を削除して、まだバッジを獲得していないことを確認すると、次の結果が返されます。

name            description                                             badge_id
Baker's Dozen   Add 13 items to your Johnny Cupcakes shelf.             sdfKHJkun7
Cupcaker        Have 82 items on your Johnny Cupcakes shelf.            4MeoheBdik
Freshly Baked   Have your first item on your Johnny Cupcakes shelf...   kdJGH98NdI

これはまさに私が期待するものです。AND NOT EXISTS チェックが唯一の違いです。users_badges テーブルにはまだデータがないので、false を返す理由がわかりません。false を返すことはできないようです。クエリ全体が無効になるのはなぜですか?

4

2 に答える 2

1

テーブルに行を追加することで解決したようです。テーブルが空の場合、SQLはEXISTS条件をチェックせず、テーブルに行が存在する可能性がないため、常にfalseを返します。

于 2012-07-18T18:37:39.710 に答える
1

NOT EXISTSLEFT JOIN/に置き換えてみてくださいIS NULL:

SELECT    b.name, b.description, b.badge_id 
FROM      badges b 
LEFT JOIN user_badges ub ON b.badge_id = ub.badge_id AND ub.user_id = 'fMcBBx'
WHERE     b.type = 'have' AND 
          b.brand_id = 'zTR7wH5FMl' AND 
          b.amount <= 89 AND
          b.series_id IS NULL AND 
          ub.badge_id IS NULL
于 2012-07-18T18:41:01.480 に答える