我有一个练习查询需要制定,但是这个练习明确告诉你不要使用视图,所以它也很棘手。它是基于Musicbrainz数据库模式设计的,但是只使用了以下关系,并剥离了所有未使用的属性:
label {id(PK), name}
release {id(PK), name}
-- associates a label to all its releases
release_label {id(PK), release(FK), label(FK)}
查询内容为:“列出所有没有发布任何共同发行的唱片公司对,但与同一第三个唱片公司合作发布了一个发行(显示唱片公司对的名称)”。
我已经试图理解这个查询几天了,但我只能使用同一张表的自连接来创建对,解决了前半部分(从未发布过共同发行的标签对)。
SELECT DISTINCT label_1.name, label_2.name
FROM label label_1 JOIN label label_2 ON label_1.name < label_2.name
WHERE NOT EXISTS
(SELECT *
FROM release release_A
JOIN release_label RLA ON release_A.id = RLA.release
JOIN label label_A ON RLA.label = label_A.id
JOIN release release_B ON release_A.name = release_B.name
JOIN release_label RLB ON release_B.id = RLB.release
JOIN label label_B ON RLB.label = label_B.id
WHERE label_1.name = label_A.name AND label_2.name = label_B.name
)
基本上,外部查询按顺序创建每对唱片标签,并使用相关子查询选择每对唱片标签,以搜索这两个唱片标签之间是否存在任何共同的发行。 这部分按预期工作,但是我不知道如何在不使用任何视图或任何条件或控制结构的情况下找到相同的第三个标签。 帮帮我。