Вопросы SQL - Средняя сложность - PullRequest
1 голос
/ 06 февраля 2011

Я борюсь за Q9 с этого сайта: http://sqlzoo.net/a1m.htm

Это то, что я записал в данный момент, хотя я знаю, что это неправильно

SELECT ID, 
       modle, 
       DOW, 
       TOD
  FROM event x
 WHERE modle = (SELECT modle
                  FROM event y
                 WHERE y.TOD = x.TOD)

Вот ссылка на диаграмму ER: sqlzoo.net/a1.htm

Как правильно это сделать?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2011

Проблема с этим:

SELECT ID, modle, DOW, TOD 
  FROM event x 
 WHERE modle = (SELECT modle FROM event y WHERE y.TOD = x.TOD)

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

SELECT ID, modle, DOW, TOD 
  FROM event x 
 WHERE modle IN (SELECT modle FROM event y WHERE y.TOD = x.TOD)

В противном случае вы захотите использовать критерии агрегирования или фильтрации, чтобы гарантировать, что из подзапроса всегда возвращается одна запись.

Я предпочитаю использовать синтаксис ANSI-92 JOIN:

SELECT x.*
  FROM EVENT x
  JOIN EVENT y ON y.tod = x.tod
              AND y.modle = 'co72010'

Использование IN

SELECT x.*
  FROM EVENT x
 WHERE x.tod IN(SELECT y.tod 
                  FROM EVENT y
                 WHERE y.modle = 'co72010')

Использование EXISTS

SELECT x.*
  FROM EVENT x
 WHERE EXISTS(SELECT NULL
                FROM EVENT y
               WHERE y.modle = 'co72010'
                 AND y.tod = x.tod)
0 голосов
/ 06 февраля 2011

Вы должны попытаться использовать соединение, используя дважды одну и ту же таблицу.Начните с:


SELECT e2.id
FROM event AS e1, event AS e2
WHERE e1.modle = 'co72010'
AND …

Я позволю вам заполнить точки.

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