2016-09-14 80 views
0

表是:SQL查询(难道我使用COUNT?)

名单谁所有有兴趣的任何客户的名称:

ARTIST(artistID,LastName,FirstName,Nationality,DOB) 

CUSTOMER(customerID,FirstName,LastName) 

CUSTOMER_ARTIST_INT(artistID,CustomerID) 

需要与进行SQL查询了这个问题帮助来自美国的艺术家。

对SQL来说很新鲜的东西会让有人把我推向正确的方向。

这是我到目前为止,不知道如果我在正确的轨道上。

SELECT C.FirstName, C.LastName, A.NATIONALITY 
FROM dtoohey.CUSTOMER C, dtoohey.ARTIST A, dtoohey.CUSTOMER_ARTIST_INT I 
WHERE C.CUSTOMERID=I.CUSTOMERID AND A.ARTISTID=I.ARTISTID; 

编辑:使用的Oracle SQL Developer

+0

你也可以使用一个不同的,因为这看起来像客户会重复每一个艺术家。 –

+0

您使用的是Oracle还是MySQL?不要使用不适当的标签。 – Barmar

回答

0

你想加入所有三个表在一起,然后指定'美国为WHERE条款,我相信国籍......

SELECT C.* 
FROM Customer C 
INNER JOIN customer_artist_int ca ON c.customerID = ca.customerID 
INNER JOIN artist a ON a.artistID = ca.artistID 
WHERE a.Nationality = 'United States' 

编辑:我现在注意到,你说你想列出对全部感兴趣的艺术家来自美国的客户。你的意思是你只想要对感兴趣的客户,每个美国艺术家?如在约翰史密斯只对有一个美国艺术家感兴趣,他的名字应该是而不是被包括在内?这个逻辑会更深入,但我会等待你的指示继续下去。

+0

这是正确的,只有对美国所有艺术家感兴趣的客户应该包括在内。 – joel0z

-1

假设国籍是一个字符串和艺术家都是独一无二的:

WITH us_artists_cnt AS (
    SELECT COUNT(*) AS us_artists_cnt 
    FROM Artists 
    WHERE Nationality = 'United States'), 
customers_artists AS (
    SELECT C.customerID, C.FirstName, C.LastName, A.NATIONALITY, count(*) cnt 
    FROM Customer C 
    INNER JOIN customer_artist_int CA on CA.customerID = C.customerID 
    INNER JOIN Artist A on A.artistID = CA.artistID 
    WHERE A.nationality = 'United States' 
    GROUP BY C.customerID) 
SELECT C.customerID, C.FirstName, C.LastName, A.NATIONALITY, cnt 
FROM customers_artists 
WHERE cnt = us_artists_cnt 

这接近。让我知道这是怎么回事。

+0

如果我错了,请纠正我,但是你的第一个“WITH”是计算所有美国艺术家的数量。假设它返回5.您的第二个“WITH”将加入三个表并将记录计数为“cnt”。如果我是一个用户,并且我喜欢5个欧洲乐队,那么第二个'WITH'不会将'cnt'返回为5,从而使'cnt = us_artists_cnt'成为true?我相信你也需要在第二个“WITH”中加入WHERE A.nationality ='United States'。 – Santi

+0

是的,先生,你是正确的。编辑调整 – JSF

+0

感谢您花时间帮忙!这正是我需要的!,我已经单独运行了这个查询的部分,并且它返回了我正在查找的值。然而,当我运行整个查询时,我收到错误“缺少选择关键字”行“5列:1.它是如此接近!只需要解决这个错误 – joel0z

0

如果您将客户与来自美国的艺术家以及来自客户的小组一起加入,您可以使用having条款将计数与美国艺术家总人数进行比较。如果算上匹配客户返回行:

select c.FirstName, c.LastName 
    from customer c 
    join customer_artist_int cai 
    on cai.CustomerID = c.customerID 
    join artist a 
    on a.artistID = cai.artistID 
    and a.Nationality = 'United States' 
group by c.customerID, c.FirstName, c.LastName 
having count(*) = (select count(*) 
        from artist 
        where Nationality = 'United States')