0

在 oracle sql 中,假设我有一张游戏开发者表和一张游戏商店销售的产品表。想象一下,我正在尝试仅选择游戏商店中可用产品总数少于 10 的游戏开发者。

为此,我将表称为“开发人员”和“游戏”。Developers 包含一个 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 的开发人员列表的任何想法?

4

2 回答 2

1

一种方法是:

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-09T18:57:41.897 回答
0

另一种选择,可能会也可能不会更清楚

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

如果你改变你的观点来做 a 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
于 2019-09-09T19:26:38.393 回答