Один пример манипулирования базой данных в SQL - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь написать запрос, который содержит информацию о сотрудниках, у которых есть как минимум 2 ребенка ростом менее 170 см и количество этих детей.

Это определение таблицы для каждой таблицы 'employee' и 'child'

CREATE TABLE Employee(
    ID CHAR(10) PRIMARY KEY,
    SSN CHAR(15) NOT NULL,
    FNAME CHAR(15),
    LNAME CHAR(15),
    DOB DATE NOT NULL
);

CREATE TABLE Child(
    ID CHAR(10),
    NAME CHAR(15),
    HEIGHT NUMBER,
    PRIMARY KEY(ID,NAME),
    FOREIGN KEY(ID) REFERENCES Employee(ID) ON DELETE CASCADE
);

Это запрос, который я сейчас создаю:

SELECT e.ID, COUNT(*) AS NumberOfChildren 
    FROM Employee e JOIN Child c ON e.ID = c.ID 
    WHERE c.HEIGHT > 170 
    GROUP BY c.ID 
    HAVING COUNT(*) > 1;

он не компилируется, кто-нибудь может мне помочь с этим? Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

изменить "GROUP BY c.ID" на "GROUP BY e.ID".

SELECT e.ID, COUNT(*) AS NumberOfChildren 
FROM Employee e JOIN Child c ON e.ID = c.ID 
WHERE c.HEIGHT > 170 
GROUP BY e.ID 
HAVING COUNT(*) > 1
0 голосов
/ 16 ноября 2018

По вашему запросу, сгруппируйте по предложению, данному e.ID, а не c.ID

SELECT e.ID, COUNT(e.*) AS NumberOfChildren 
    FROM Employee e JOIN Child c ON e.ID = c.ID 
    WHERE c.HEIGHT > 170 
    GROUP BY e.ID 
    HAVING COUNT(e.*) > 1;
0 голосов
/ 16 ноября 2018

Сначала Вы делаете этот запрос .. И добавляете Proper Join, даже Join и Inner Join эквивалентны ..

SELECT 
   e.ID, 
   COUNT(e.*) AS NumberOfChildren 
FROM 
   Employee e 
   INNER JOIN Child c ON e.ID = c.ID AND c.HEIGHT > 170
GROUP BY 
   e.ID
HAVING 
   COUNT(e.*) > 1;

РЕДАКТИРОВАТЬ:

Как я вижу в вашем комментарии.. Определение Group By делать Group By со всеми Select выражениями без Aggregate Condition ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...