在oracle sql中,假设我有一个游戏开发人员表和一个游戏商店销售的产品表。想象一下,我试图只选择游戏开发人员,在游戏商店的产品总数量少于10。
因此,我会称这些表为“开发者”和“游戏”。开发人员包含一个DEV_ID的PK,它将作为游戏中GAME_DEV的FK。
CREATE TABLE Developers (
DEV_ID varchar(5) NOT NULL PRIMARY KEY,
DEV_NAME varchar(20) NOT NULL);
CREATE TABLE Games (
GAME_ID varchar(5) NOT NULL PRIMARY KEY
GAME_NAME varchar(20) NOT NULL,
GAME_PRICE varcher(10) NOT NULL,
GAME_DEV varchar(5) NOT NULL,
CONSTRAINT game_fk FOREIGN KEY (GAME_DEV)
REFERENCES Developers(DEV_ID));
我尝试过创建一个视图,然后尝试只从条目数量小于10的视图中选择DEV_ID。
CREATE OR REPLACE VIEW games_developers AS
SELECT * FROM Games g
INNER JOIN Developer d
ON g.GAME_DEV = d.DEV_ID;
SELECT DEV_ID FROM games_developers
WHERE COUNT(DEV_NAME) < 10;
现在,我收到了错误消息:“这里不允许组函数”,对于我如何能够拉出一个在商店中只有不到10的可用游戏数量的开发人员列表,我有什么想法吗?
发布于 2019-09-09 18:57:41
一种方法是:
SELECT d.*
FROM Developer d
WHERE d.DEV_ID IN (SELECT g.GAME_DEV
FROM Games g
GROUP BY g.GAME_DEV
HAVING COUNT(*) < 10
);
然而,这将错过没有游戏在商店的开发人员。所以:
SELECT d.*
FROM Developer d
WHERE d.DEV_ID NOT IN (SELECT g.GAME_DEV
FROM Games g
GROUP BY g.GAME_DEV
HAVING COUNT(*) >= 10
);
发布于 2019-09-09 19:26:38
另一种选择,可能更清楚,也可能不会更清楚
select d.dev_id, d.dev_name, count(*) num_games
from developer d
left outer join games g
on( d.dev_id = g.game_dev )
group by d.dev_id, d.dev_name
having count(*) < 10
如果您将视图改为执行left outer join
,则只需
select d.dev_id, d.dev_name, count(*) num_games
from games_developers d /* If the view does an outer join */
group by d.dev_id, d.dev_name
having count(*) < 10
https://stackoverflow.com/questions/57859751
复制相似问题