这是一个简单的示例,但我试图了解如何使用 SQL 进行创造性思考。
例如,我有下表,我想查询有三个或更多问题
的人
的姓名。如何在不使用 HAVING
或 COUNT
的情况下执行此操作?我想知道使用 JOINS
或类似的东西是否可以实现这一点?
各位
folkID name
---------- --------------
01 Bill
02 Joe
03 Amy
04 Mike
05 Chris
06 Elizabeth
07 James
08 Ashley
问题
folkID questionRating questionDate
---------- ---------- ----------
01 2 2011-01-22
01 4 2011-01-27
02 4
03 2 2011-01-20
03 4 2011-01-12
03 2 2011-01-30
04 3 2011-01-09
05 3 2011-01-27
05 2 2011-01-22
05 4
06 3 2011-01-15
06 5 2011-01-19
07 5 2011-01-20
08 3 2011-01-02
最佳答案
使用 SUM
或 CASE
对我来说似乎是作弊!
我不确定您当前的表述是否可行,但如果您向问题表添加主键 (questionid
),则以下内容似乎有效:
SELECT DISTINCT Folks.folkid, Folks.name
FROM ((Folks
INNER JOIN Question AS Question_1 ON Folks.folkid = Question_1.folkid)
INNER JOIN Question AS Question_2 ON Folks.folkid = Question_2.folkid)
INNER JOIN Question AS Question_3 ON Folks.folkid = Question_3.folkid
WHERE (((Question_1.questionid) <> [Question_2].[questionid] And
(Question_1.questionid) <> [Question_3].[questionid]) AND
(Question_2.questionid) <> [Question_3].[questionid]);
抱歉,这是 MS Access SQL 中的内容,但它应该转换为任何类型的 SQL。
返回:
folkid name
3 Amy
5 Chris
更新:只是为了解释为什么它有效。每次加入都会返回该人提出的所有问题 ID。然后,where 子句仅留下问题 ID 的唯一行。如果询问的问题少于三个,则不会有唯一的行。
例如,比尔:
folkid name Question_3.questionid Question_1.questionid Question_2.questionid
1 Bill 1 1 1
1 Bill 1 1 2
1 Bill 1 2 1
1 Bill 1 2 2
1 Bill 2 1 1
1 Bill 2 1 2
1 Bill 2 2 1
1 Bill 2 2 2
不存在所有 id 都不同的行。
但是对于艾米来说:
folkid name Question_3.questionid Question_1.questionid Question_2.questionid
3 Amy 4 4 5
3 Amy 4 4 4
3 Amy 4 4 6
3 Amy 4 5 4
3 Amy 4 5 5
3 Amy 4 5 6
3 Amy 4 6 4
3 Amy 4 6 5
3 Amy 4 6 6
3 Amy 5 4 4
3 Amy 5 4 5
3 Amy 5 4 6
3 Amy 5 5 4
3 Amy 5 5 5
3 Amy 5 5 6
3 Amy 5 6 4
3 Amy 5 6 5
3 Amy 5 6 6
3 Amy 6 4 4
3 Amy 6 4 5
3 Amy 6 4 6
3 Amy 6 5 4
3 Amy 6 5 5
3 Amy 6 5 6
3 Amy 6 6 4
3 Amy 6 6 5
3 Amy 6 6 6
有几行具有不同的 id,因此上面的查询会返回这些行。
关于SQL : How to find number of occurrences without using HAVING or COUNT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199128/