显示满足子记录条件的父记录

Display parent records that meet condition of child records

在 oracle sql 中,假设我有 table 个游戏开发人员和 table 个游戏商店销售的产品。想象一下,我正在尝试 select 仅在游戏商店中提供的产品总数少于 10 的游戏开发者。

为此,我将 table 称为 'Developers' 和 'Games'。开发人员包含 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 的视图中仅 select 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;

现在我收到错误消息 "group function is not allowed here" 关于如何提取商店中可用游戏数量少于 10 的开发者列表的任何想法?

一种方法是:

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
                      );

另一个选项,可能更清楚也可能不更清楚

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