#sql #sqlite #subquery #relational-database #sql-except
#sql #sqlite #подзапрос #реляционная база данных #sql-except
Вопрос:
Я пытаюсь написать запрос SQLite, используя sqliteonline.com это может:
Найдите имена преподавателей, которые преподают в каждой комнате, в которой преподается какой-либо класс.
Это то, что у меня есть:
SELECT DISTINCT F.fname
FROM Faculty F
WHERE NOT EXISTS (( SELECT *
FROM Class C )
EXCEPT
(SELECT C1.room
FROM Class C1
WHERE C1.fid = F.fid ))
И это ошибка, которую я получаю:
Я дважды проверил, и скобки сбалансированы. Так что я немного запутался в том, куда идти дальше.
Ответ №1:
Это читается как проблема реляционного разделения. Я бы обратился к этому с помощью канонического подхода, используя объединения и агрегирование:
select fname
from faculty f
inner join class c on c.fid = f.fid
group by fname
having count(distinct c.room) = (select count(distinct room) from class)
Ответ №2:
Вы должны удалить круглые скобки, которые заключают каждый из подзапросов, и выбрать одни и те же столбцы в каждом из них (я думаю, только room
это необходимо):
SELECT F.fname
FROM Faculty F
WHERE NOT EXISTS ( SELECT room FROM Class C
EXCEPT
SELECT C1.room
FROM Class C1
WHERE C1.fid = F.fid
)
Также DISTINCT
на самом деле не нужно, потому что вы выбираете уникальные (я полагаю) fname
s из Faculty
.
Ответ №3:
Проблема select *
в том, что . Просто выберите один и тот же столбец с обеих сторон except
:
SELECT F.fname
FROM Faculty F
WHERE NOT EXISTS (SELECT c.Room
FROM Class C
EXCEPT
SELECT C1.room
FROM Class C1
WHERE C1.fid = F.fid
)
Примечание: вероятно, вам следует выбрать не только первое имя. Строки в Faculty
должны быть уникальными.
Комментарии:
1. Привет, спасибо за быстрый ответ. Итак, я только что ввел ваш ответ, но я все еще получаю ту же ошибку.
2. @PeterShepherd . . . SQLite не нравятся дополнительные круглые скобки.