2013-03-11 3 views
0

После учебника «SQL в ореховой скорлупе» Он просит для запросаSQL-запрос с иностранным ограничением

Для сотрудников с адресом электронной почты, отображают их возраст и пол.

На следующей базе:

CREATE TABLE EMPLOYEES(
    PID SMALLINT NOT NULL, 
    PRIMARY KEY(PID), 
    CONSTRAINT EMPLOYEES_FK FOREIGN KEY (PID) REFERENCES PERSONS (PID) 
); 

CREATE TABLE PERSONS(
PID SMALLINT NOT NULL, 
NAME VARCHAR(20) NOT NULL, 
GENDER CHAR(1) NOT NULL CHECK (GENDER IN ('M','F')), 
AGE SMALLINT NOT NULL CHECK (AGE BETWEEN 0 AND 120), 
BIRTHDATE DATE NOT NULL, 
PRIMARY KEY(PID) 
); 

CREATE TABLE HASE(
PID SMALLINT NOT NULL, 
EADDR VARCHAR(30) NOT NULL, 
PRIMARY KEY(PID,EADDR), 
CONSTRAINT HASE_FK FOREIGN KEY (PID) REFERENCES PERSONS (PID) 
); 

Я очень новой для запросов SQL так что моя попытка была:

SELECT GENDER, AGE 
FROM PERSONS AND EMPLOYEES 
WHERE EXISTS HASE.EADDR 
; 

Но я не думаю, что им получать отношение прямо с внешней ключ. Я понимаю, что это очень просто, но я думаю, как только я увижу, как делается запрос, это поможет мне с другими.

+0

Не имеет отношения к вашему вопросу, но MySQL не устанавливает контрольные ограничения. –

ответ

2

Вы можете использовать EXISTS, чтобы получить ваши результаты

SELECT Gender, Age 
FROM Persons 
    JOIN Employees ON Persons.PID = Employees.PID 
WHERE Exists (SELECT PID 
       FROM Hase 
       WHERE Persons.PID = Hase.PID) 

Вы также можете использовать IN, но EXISTS запрос будет быстрее

SELECT Gender, Age 
FROM Persons 
    JOIN Employees ON Persons.PID = Employees.PID 
WHERE Persons.PID IN (SELECT PID 
         FROM Hase) 
+1

+1, потому что это вернет ожидаемые результаты, если у сотрудника есть * более одного * адреса электронной почты. –

1
SELECT DISTINCT 
    persons.NAME, 
    persons.GENDER, 
    persons.AGE 
FROM 
    persons INNER JOIN employees 
    ON persons.PID = employees.PID 
    INNER JOIN hase 
    ON persons.PID = hase.PID 

Пожалуйста, смотрите скрипку here.

+0

Обратите внимание, что для этого запроса потребуются дополнительные накладные расходы из-за использования DISTINCT и присоединения к дополнительной таблице. –

+0

Присоединение @MattBusche не должно быть проблемой (вы также можете пропустить оба соединения и использовать два предложения IN и AND). Но верно, что DISTINCT может быть медленнее. – fthiella

Смежные вопросы