Подзапросы для концертной базы данных - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть таблица Концертов в БД Oracle, которая содержит атрибуты ID / Город / Исполнитель / Цена.Я пытаюсь написать запрос, чтобы увидеть, видел ли какой-то город трех одинаковых художников (то есть мне нужно только проверить, было ли у трех художников хотя бы одно событие в этом городе).

select City 
from Concerts A
where exists (select Artist from Concerts B where B.City = A.City)
and exists (select Artist from Concerts C where C.City = A.City)
and exists (select Artist from Concerts D where D.City = A.City);

Результат этого запроса включает несколько значений;но копание данных говорит мне, что это невозможно для некоторых городов.Что не так с моей логикой здесь?

Ответы [ 4 ]

0 голосов
/ 29 сентября 2018

Вы хотите, чтобы в городах было три художника того же .Вы должны думать group by.В этом случае вы можете получить все такие пары городов и художников, используя:

Select city, artist
from concert
group by city, artist
having count(*) >= 3;

Если вы просто хотите, чтобы города, где это произошло, но вас не волнует художник:

select distinct city
from concert
group by city, artist
having count(*) >= 3;

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * *. художников.Это не совсем то же самое и не совсем понятно, потому что ваш первоначальный вопрос не содержит имен исполнителей.

Вы можете легко сделать это с помощью group by / having:

select city
from concert
where artist in ('Kanye', 'Jay-Z', 'Kendrick')
group by city
having count(distinct artist) >= 3;
0 голосов
/ 29 сентября 2018

Проблема в том, что каждая запись соответствует самой себе, поэтому вам нужно убедиться, что записи, найденные, например, по запросу B, не совпадают с записями, найденными запросами A, C и D.Вы можете использовать соединения здесь:

select DISTINCT A.City 
from Concerts A
INNER JOIN CONCERTS B
  ON B.CITY = A.CITY AND
     B.ID <> A.ID
INNER JOIN CONCERTS C
  ON C.CITY = A.CITY AND
     C.ID <> A.ID
INNER JOIN CONCERTS D
  ON D.CITY = A.CITY AND
     D.ID <> A.ID;

SQLFiddle здесь

Удачи.

0 голосов
/ 29 сентября 2018

Вы можете использовать Самостоятельное соединение и Желать соответствующий Выход.

   select DISTINCT A.City 
   From Concerts A,Concerts B,Concerts C,Concerts D WHERE
   A.CITY = B.CITY AND
   A.ID <> B.ID AND
   A.CITY = C.CITY AND
   A.ID <> C.ID AND
   A.CITY = C.CITY AND
   A.ID <> C.ID

Я думаю, что это один полезный для вас.

0 голосов
/ 29 сентября 2018

Вы, кажется, говорите, что хотите получить список городов, в которых было по крайней мере 3 разных исполнителя, но предоставленный вами запрос этого не делает, он просто привязывает концертный стол к себе 3 раза идентичным образом.Эта ссылка всегда будет выполняться одинаково и, по сути, не является операцией, потому что она спрашивает, есть ли в таблице данные, которые существуют сами по себе - что-то верное для любой таблицы базы данных, имеющей хотя бы одну строку

. Именно поэтому ваша логикане работает, но для запроса, который работает что-то вроде:

Select city from concert group by city having count(distinct artist)>= 3

Может быть более подходящим

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