我无法获取此查询,该查询应该根据ISBN提供Book数据和其他版本的数量:
SELECT *, Editions_Count
FROM Books
LEFT JOIN ((SELECT Edition_Group_ISBN, COUNT(*) AS Editions_Count
FROM Books
WHERE Edition_Group_ISBN IN (SELECT Edition_Group_ISBN
FROM Books)
GROUP BY Edition_Group_ISBN) AS b
) ON (Books.Edition_Group_ISBN = b.Edition_Group_ISBN
AND Books.Edition_Group_ISBN != NULL)
WHERE ISBN = 9780140447897
该查询给出了9780140447897的书籍数据,但它给出了Editions_Count AS NULL,表明LEFT JOIN不起作用。
答案 0 :(得分:5)
尝试这个更简单的查询:
SELECT b.*, COUNT(*) AS Editions_count
FROM Books b JOIN Books g USING (Edition_Group_ISBN)
WHERE b.ISBN = 9780140447897
GROUP BY b.book_id;
我认为你提出的问题比你需要的要困难得多。您的原始查询充满了令人困惑的子查询,其中至少有一个完全是多余的。
重新评论:
是的,可以通过这种方式将ISBN与多个值进行比较:
SELECT b.*, COUNT(*) AS Editions_count
FROM Books b JOIN Books g USING (Edition_Group_ISBN)
WHERE b.ISBN IN (9780140447897, 9781934356555)
GROUP BY b.book_id;
COUNT(*)
仅支持普通通配符*
,这意味着计算组中的所有行。
或者您可以使用COUNT(g.Edition_Group_ISBN)
之类的特定表达式,这意味着计算该表达式为非null的组中的所有行。
但你不能使用g.*
,因为它含糊不清。它是否计算组中的所有行? (如果是这样,只需使用COUNT(*)
)它是否计算组中的非空行?这意味着什么 - 计算来自g
的所有列的行是非空的,或者来自g
的任何列的行是非空的空值?由于这些原因,COUNT(g.*)
根本不是SQL语言中的法律结构。
答案 1 :(得分:1)
查询似乎包含了许多重言式 - 这些陈述总是正确的。
我认为你可以将其简化为
SELECT books.*, b.Editions_Count
FROM Books
LEFT JOIN ((SELECT Edition_Group_ISBN, COUNT(*) AS Editions_Count
FROM Books
GROUP BY Edition_Group_ISBN) AS b
) ON (Books.Edition_Group_ISBN = b.Edition_Group_ISBN)
WHERE ISBN = 9780140447897
子选择(WHERE .. IN)和JOIN条件ID!= NULL是多余的。
你可以通过在Edition_Group_ISBN上进行自我加入来实现同样的目的:
SELECT b.*, count(b2.*)
FROM Books b INNER JOIN Books b2 ON (b.Edition_Group_ISBN=b2.Edition_Group_ISBN)
GROUP BY b.ISBN
HAVING b.ISBN = ...;
编辑: 修复是删除JOIN条件Edition_Group_ISBN!= NULL,因为此表达式将始终为false。 (对于!=的NULL操作数返回NLLL结果。)这使整个连接条件为NULL(false),因此左连接失败。