SQL在哪里和哪里[重复]
Posted
技术标签:
【中文标题】SQL在哪里和哪里[重复]【英文标题】:Where And Where SQL [duplicate] 【发布时间】:2020-06-25 01:36:04 【问题描述】:我有一个数据库。我想看有英文和西班牙文字幕的电影。我想做这样的sql查询,它不起作用。
SELECT name,language FROM DvD
JOIN Subtitles ON Dvd.dvdID=Subtitle.dvdID
where language='EN' and language='ES';
但是当我尝试这样做时,它起作用了。
SELECT name,language FROM DvD
JOIN Subtitles ON Dvd.dvdID=Subtitle.dvdID
where language='EN' or language='ES';
【问题讨论】:
【参考方案1】:如果您想要同时拥有两者的 DVD,您实际上需要聚合:
SELECT dvd.name
FROM DvD JOIN
Subtitles s
ON Dvd.dvdID = s.dvdID
WHERE s.language IN ('EN', 'ES')
GROUP BY dvd.name
HAVING COUNT(*) = 2; -- both are present!
您的版本返回的 DVD 有英语或西班牙语,但不一定两者兼有。
【讨论】:
【参考方案2】:您的第二个查询不符合您的要求。它会检查 DVD 是否至少具有两种语言中的一种(这与同时具有两种语言不同)。
您可以使用存在来检查两者:
SELECT name, language
FROM DvD d
WHERE
EXISTS (SELECT 1 FROM Subtitles s WHERE s.dvdID = d.dvdID AND language='EN')
AND EXISTS (SELECT 1 FROM Subtitles s WHERE s.dvdID = d.dvdID AND language='ES')
使用subtitles(dvdID, language)
上的索引,此选项应该比使用连接和聚合的替代方法更有效(尽管编写时间有点长)。
您也可以使用聚合 suqbuery 执行此操作:
SELECT name, language
FROM DvD d
WHERE (
SELECT COUNT(*)
FROM Subtitles s
WHERE s.dvdID = d.dvdID AND language IN ('EN', 'ES')
) = 2
【讨论】:
以上是关于SQL在哪里和哪里[重复]的主要内容,如果未能解决你的问题,请参考以下文章