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在哪里和哪里[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在哪里获得适用于 Linux 的 msbuild [重复]

是啥 ?。运营商和我可以在哪里使用? JavaScript中的空值合并运算符[重复]

SQL服务器在哪里?

java 8中存储的静态变量在哪里? [重复]

Eclipse中的外部工具启动配置在哪里[重复]

我的 android 应用程序的 apk 文件在哪里? (通过日食)[重复]