SQL困难的JOIN表

时间:2013-10-23 21:27:02

标签: sql

假设我写了一个查询,找到所有艺术家的名字,这些艺术家的成员并非出生于20世纪60年代,另一个查询是为了找到所有没有任何成员出生于20世纪60年代的艺术家的名字。

所以我们谈到这三个表:

艺术家

ArtistID, ArtistName, Region, EntryDate

成员

MemberId, Firstname, Lastname, Birthday

Aritsts和Members Tables之间的关系是XrefArtistsMembers表:

XrefArtistsMembers

MemberId, ArtistID, RespParty

我已经使用以下命令启动了查询:

select salesid, firstname, lastname, birthday 
from members 
where year(birthday) >= 1970 or year(birthday) < 1960;

但是在第一个查询的结果中出现而在第二个查询的结果中出现的任何艺术家的情况都是如此?

3 个答案:

答案 0 :(得分:0)

每个都可以在IN或NOT IN条件下完成:

-- Artists with NO members born in the 60s

SELECT * FROM Artists
WHERE ArtistID NOT IN (
    SELECT ArtistID 
    FROM XrefArtistsMembers x
    INNER JOIN Members m ON x.MemberId = m.MemberID
    WHERE year(birthday) BETWEEN 1960 AND 1969)

-- Artists with ANY member NOT born in the 60s

SELECT * FROM Artists
WHERE ArtistID IN (
    SELECT ArtistID 
     FROM XrefArtistsMembers x
    INNER JOIN Members m ON x.MemberId = m.MemberID
    WHERE year(birthday) NOT BETWEEN 1960 AND 1969
)

答案 1 :(得分:0)

你可以获得60岁以外出生的艺术家名单:

SELECT DISTINCT ArtistName
FROM Artists a
JOIN XRefArtistsMembers am ON a.ArtistID = am.ArtistID
JOIN Member m ON m.MemberID = am.MemberID
WHERE YEAR(m.birthday) NOT BETWEEN 1960 and 1969;

让那些拥有 no 成员的艺术家出生于60年代:

SELECT DISTINCT ArtistName
FROM Artists a
LEFT JOIN XrefArtistsMembers am ON a.ArtistID = am.ArtistID
LEFT JOIN Member m ON m.MemberID = am.MemberID AND YEAR(m.birthday) BETWEEN 1960 and 1969
WHERE m.MemberID IS NULL

答案 2 :(得分:0)

问题似乎不是寻找代码。问题是:

  

但是在第一个查询的结果中出现而在第二个查询的结果中出现的任何艺术家的情况都是如此?

所以,第一个查询得到所有艺术家与SOME成员不是1960年出生。第二个查询得到所有艺术家没有成员出生于1960年。因此,你可以肯定的是,在第一个查询中返回的艺术家有有些但不是所有成员(不是)出生于1960年。