In oracle sql, imagine I have a table of game developers and a table of products sold by a game store. Imagine I am trying to select only game developers that have a total amount of products available at the game store that is less than 10.
For the sake of this, I will call the tables ‘Developers’ and ‘Games’. Developers contains a PK of DEV_ID which will serve as the FK of GAME_DEV in Games.
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));
I have tried doing something like creating a view, and then trying to select only the DEV_ID from the view where the amount of entries is less than 10. Heres what ive tried:
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;
Now I get the error message “group function is not allowed here” Any ideas of how I can pull a list of developers who only have an available amount of games at the store that is less than 10?
Advertisement
Answer
One method is:
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
);
However, this will miss developers with no games in the store. So:
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
);