【发布时间】:2019-09-25 04:02:21
【问题描述】:
这个问题与以下hackerrank挑战有关: https://www.hackerrank.com/challenges/challenges/problem
有效的版本返回正确的结果集,而另一个返回不完整的结果集,因为 count(*) 在 in 子句中无法按预期工作
这两个代码片段之间的唯一区别是 or 的第一个子句中的 c_count 而不是 count(*)。
由于 c_count 等于 count(*),所以应该没有语义差异。如果count(*) in 语法错误,为什么count(*) = 有效?
这行得通:
select count(*) as c_count ... having c_count in (select ...) or count(*) = (select ...);
这行不通:
select count(*) as c_count ... having count(*) in (select ...) or count(*) = (select ...);
这是原始查询。 /**/评论指出两者的区别:
工作:
SELECT h.hacker_id
,h.name
,count(*) AS c_count
FROM Hackers h
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING
/*USING c_count ALIAS*/
c_count IN (
SELECT hacker_c_counts2.c_count2
FROM (
SELECT count(*) AS c_count2
FROM Challenges c2
GROUP BY c2.hacker_id
) AS hacker_c_counts2
GROUP BY hacker_c_counts2.c_count2
HAVING count(*) = 1
)
OR count(*) = (
SELECT max(hacker_c_counts.c_count1)
FROM (
SELECT count(*) AS c_count1
FROM Challenges c1
GROUP BY c1.hacker_id
) AS hacker_c_counts
)
ORDER BY count(*) DESC, h.hacker_id;
不工作:
SELECT h.hacker_id
,h.name
,count(*) AS c_count
FROM Hackers h
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING
/*USING count(*) directly*/
count(*) IN (
SELECT hacker_c_counts2.c_count2
FROM (
SELECT count(*) AS c_count2
FROM Challenges c2
GROUP BY c2.hacker_id
) AS hacker_c_counts2
GROUP BY hacker_c_counts2.c_count2
HAVING count(*) = 1
)
OR count(*) = (
SELECT max(hacker_c_counts.c_count1)
FROM (
SELECT count(*) AS c_count1
FROM Challenges c1
GROUP BY c1.hacker_id
) AS hacker_c_counts
)
ORDER BY count(*) DESC, h.hacker_id;
【问题讨论】:
-
删除尽可能多的代码,仍然有问题。
-
我有点困惑。您有多个查询和片段,其中一些有效,有些无效。很难按照您的要求进行操作。
-
你能再检查一次吗
-
我无法使用更简化的查询来复制 [like this]。(sqlfiddle.com/#!9/287e79/3) 也许我错过了什么?
-
我已经重新添加了您原来的复杂 SQL,因为除了使用您的别名与直接使用
count(*)之外可能存在问题。