Я пытаюсь изучить запросы sqlite, но продолжаю получать эту ошибку

#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 не нравятся дополнительные круглые скобки.