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 EXISTS/LEFT 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 回答