有关连接表的

时间:2016-04-14 18:59:46

标签: sql oracle inner-join

我正在Oracle中进行SQL分配。有两个表。

table1被称为Person10:

字段包括:ID,Fname,Lname,State,DOH,JobTitle,Salary,Cat。

table2被称为StateInfo:

字段包括:State,Statename,Capital,Nickname,Pop2010,pop2000,po​​p1990,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;

它给我一个错误的表达错误。我可能需要一个小组表达......但我不知道我做错了什么。

4 个答案:

答案 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