这是一个简单的例子,但我试图理解如何使用SQL创造性思考。
例如,我在下面有以下表格,并且我想查询具有三个或更多folks
的{{1}}的名称。如何在不使用questions
或HAVING
的情况下执行此操作?我想知道这是否可以使用COUNT
或类似的东西?
FOLKS
JOINS
问题
folkID name
---------- --------------
01 Bill
02 Joe
03 Amy
04 Mike
05 Chris
06 Elizabeth
07 James
08 Ashley
答案 0 :(得分:3)
使用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,因此上述查询会返回这些行。
答案 1 :(得分:0)
你可以尝试总和,以取代计数。
SELECT SUM(CASE WHEN Field_name >=3 THEN field_name ELSE 0 END)
FROM tabel_name
答案 2 :(得分:0)
SELECT f.*
FROM (
SELECT DISTINCT
COUNT(*) OVER (PARTITION BY folkID) AS [Count] --count questions for folks
,a.folkID
FROM QUESTION AS q
) AS p
INNER JOIN FOLKS as f ON f.folkID = q.folkID
WHERE p.[Count] > 3