2013-11-22 4 views
1

Мой вопрос: Как показать имя каждого исполнителя, записавшего хотя бы один заголовок в студии, где записана группа: «The Bullets»?SQL Subquery using HAVING COUNT

я сформулировал следующий запрос:

select ar.artistname, ti.titleid from artists ar 
where exists 
(
select 0 
from titles ti where ti.artistid = ar.artistid 
and exists 
(
select 0 
from studios s 
where s.studioid = ti.studioid 
and ar.artistname = 'The Bullets' 
) 
); 

Однако, мне нужно включить HAVING COUNT (ti.titleid)> 0, чтобы удовлетворить эту часть, «каждый художник, который записал по крайней мере один титул» в вопрос.

Я также не уверен, как соответствовать имени художника, «The Bullets», которые записали хотя бы одну студию.

В таблице художников resmebles следующее:

Artists 
------- 
ArtistID, ArtistName, City 

Таблица Дорожки resmebles следующее:

Tracks 
------ 
TitleID, ArtistID, StudioID 

Студии стол resmebles folllowing:

Studios 
------- 
StudioID, StudioName, Address 

Я также сусло укажите, что я не могу использовать объединения, например, предпочтение производительности.

+0

Ваш запрос в порядке, вам не нужен 'HAVING COUNT (*)> 0'. Если существует одна строка, это больше, чем 0, не так ли? –

+0

Ну, мне нужно знать, записали ли пули хотя бы один титул в студии, где группа. Отредактировано с этой реализацией. Правильно ли это? Не могли бы вы сказать? – user2948897

+0

Вы не можете использовать соединения? Зачем? Это какая-то головоломка/домашнее задание? –

ответ

4

Может быть, как это?

select ArtistName from Artists where ArtistID in (
    select ArtistID from Tracks where StudioID in (
    select StudioID from Tracks where ArtistID in (
     select ArtistId from Artists where ArtistName='The Bullets' 
    ) 
) 
) 

Я не понимаю, почему вы думаете, having нужен.

+0

Я думаю, что он имеет в виду, что он должен использовать, имея как требование – wvdz

+0

Когда сформулировал вопрос перед отправкой, я подумал, что это необходимо. Это лишнее? – user2948897

+0

Да. Это лишнее. –

2

Студия (s), где пули записаны

SELECT StudioID 
FROM Sudios S 
JOIN Tracks T ON S.StudioID = S.StudioID 
JOIN Artists A ON T.ArtistID = A.ArtistID AND A.ArtistName = 'The Bullets' 

Каждый артист, который записал там

SELECT A1.ArtistName, A1.City 
FROM Artist A1 
JOIN Tracks T1 ON T1.ArtistID = A2.ArtistID 
WHERE T1.SudioID IN 
(
    SELECT StudioID 
    FROM Sudios S 
    JOIN Tracks T ON S.StudioID = S.StudioID 
    JOIN Artists A ON T.ArtistID = A.ArtistID AND A.ArtistName = 'The Bullets' 
) T 
0

Эти два требования являются довольно глупыми - используя HAVING COUNT (*)> 0 и не присоединяется. Я никогда не слышал о выборе подзапросов над объединениями для повышения производительности.

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

SELECT a.ArtistName FROM Artist a 
WHERE EXISTS 
(
    SELECT t1.ArtistId FROM Track t1 
    WHERE t1.ArtistId = a.ArtistId 
    AND EXISTS 
    (
     SELECT * FROM Track t2 
     WHERE t1.StudioId = t2.StudioID 
     AND t2.ArtistName = 'The Bullets' 
    ) 
    GROUP BY t1.ArtistId, t1.StudioId 
    HAVING COUNT(*) > 0 
); 
Смежные вопросы