我正在Oracle中进行SQL分配。有两个表。
table1被称为Person10:
字段包括:ID,Fname,Lname,State,DOH,JobTitle,Salary,Cat。
table2被称为StateInfo:
字段包括:State,Statename,Capital,Nickname,Pop2010,pop2000,pop1990,sqmiles。
问题:
创建一个名为A10T2的视图,该视图将显示Person10表中至少有25人的州的StateName,Capital和Nickname,Cat值为N,年薪介于$ 75,000和$ 125,000之间。三列标题应为StateName,Capital和Nickname。行应按状态名称排序。
我有什么:
CREATE VIEW A10T2 AS
SELECT StateName, Capital, Nickname
FROM STATEINFO INNER JOIN PERSON10 ON
STATEINFO.STATE = PERSON10.STATE
WHERE Person10.CAT = 'N' AND
Person10.Salary in BETWEEN (75000 AND 125000) AND
count(Person10.CAT) >= 25
ORDER BY STATE;
它给我一个错误的表达错误。我可能需要一个小组表达......但我不知道我做错了什么。
答案 0 :(得分:1)
是的,当我第一次回答这个时,我最初搞砸了这个,因为它是在飞行中,我没有机会测试我放下的东西。我忘了使用GROUP BY更适合聚合函数(如选择中的SUM,AVG和COUNT),这可能就是它抛出错误的原因。在这种情况下,使用ORDER BY可能是正确的选项。并且您希望按州订购结果,以便使用StateName。
SELECT S.StateName, S.Capital, S.Nickname
FROM STATEINFO S
INNER JOIN PERSON10 P ON S.STATE = P.STATE
WHERE P.CAT = 'N'
AND P.Salary BETWEEN 75000 AND 125000
ORDER BY S.StateName
HAVING count(P.CAT) >= 25;
答案 1 :(得分:0)
我不是Oracle专家,但我很确定
Person10.Salary in BETWEEN (75000 AND 125000)
应该是
Person10.Salary BETWEEN 75000 AND 125000
(没有IN
且没有括号)。这就是我所知道的所有其他SQL方言的工作方式。
另外,将COUNT()
从WHERE
子句移到HAVING
子句:
CREATE VIEW A10T2 AS
SELECT StateName, Capital, Nickname
FROM STATEINFO INNER JOIN PERSON10 ON
STATEINFO.STATE = PERSON10.STATE
WHERE Person10.CAT = 'N' AND
Person10.Salary BETWEEN 75000 AND 125000
ORDER BY STATE
HAVING count(Person10.CAT) >= 25;
答案 2 :(得分:0)
尝试将您的count()移动到HAVING而不是WHERE。您还需要一个包含StateName,Capital和Nickname的GROUP BY子句。
我知道这个链接是Microsoft,而不是Oracle,但它应该会有所帮助。
https://msdn.microsoft.com/en-us/library/ms180199.aspx?f=255&MSPPError=-2147217396
答案 3 :(得分:0)
您可以尝试使用这样的子查询。
CREATE VIEW A10T2 AS
SELECT statename, capital, nickname
FROM stateinfo
WHERE statename IN (SELECT statename
FROM person10
WHERE Cat = 'N'
AND Salary BETWEEN 75000 AND 125000
GROUP BY statename
HAVING COUNT(*) >= 25)
ORDER BY statename