【问题标题】:Use of IN, INNER JOIN and EXIST for a SELECT in 3 different tables在 3 个不同的表中使用 IN、INNER JOIN 和 EXIST 进行 SELECT
【发布时间】:2015-11-08 14:47:09
【问题描述】:

我会尽量简化。

我是 SQL 新手,我需要提供 3 个 SELECT 语句来做同样的事情,一个是 IN,另一个是 INNER JOIN,最后一个是 EXISTS。通常我能够弄清楚如何去做,但困扰我的是这个请求,因为我必须从一张桌子跳到另一张桌子,而它们之间没有相同的“链接”。

假设我有这 3 个表及其属性:

[Channel] name_channel, URL_channel, company_channel
[Schedule_Channel] name_channel, num_movie, starting_date
[Movie] num_movie, name_movie

请求是显示 2015 年 11 月 1 日之后播放电影“德古拉”的每个频道的名称、网址和公司。

我的问题是,我如何从表“频道”跳转到“Schedule_Channel”,然后跳转到“电影”,这样我才能同时获得起始日期和电影名称。我知道我可以使用“Channel”和“Schedule”之间的“link”“name_channel”以及“Schedule”和“Movie”之间的“link”“num_movie”,我只是不知道如何将其写为 IN , INNER JOIN 和 EXIST 请求。

唷,我希望我的问题很清楚。根据我对这些请求的理解,这是我会做的:

对于 IN :

SELECT name_channel, URL_channel, company_channel
FROM Channel
WHERE name_channel IN (SELECT name_channel from Schedule_Channel WHERE starting_date > to_date('20151101 00:00:00','YYYYMMDD HH24:MI:SS'))
AND name_channel IN (SELECT name_channel FROM Schedule_Channel WHERE num_movie IN (SELECT num_movie FROM Movie WHERE name_movie = 'Dracula'));

对于 INNER JOIN :

SELECT c.name_channel, c.company_channel, c.URL_channel
FROM Channel c
INNER JOIN Schedule_Channel s
ON c.name_channel = s.name_channel
INNER JOIN Movie m
ON s.num_movie = s.num_movie WHERE s.starting_date > to_date('20151101 00:00:00','YYYYMMDD HH24:MI:SS') AND m.name_movie = 'Dracula';

我不知道如何为 EXIST 做到这一点......

我希望我以正确的方式提出了这个问题。对不起,如果不是这样。

非常感谢任何能帮助我理解这一切的人,我脑子里一片混乱:)

【问题讨论】:

    标签: sql oracle select inner-join


    【解决方案1】:

    试试这个:

    proc sql;
      select a.* from channel a,schedule_channel b, movie c
      where a.name_channel=b.name_channel and b.num_movie=c.num_movie
      and b.starting_date>to_date('2015-11-01','yyyy-mm-dd')
      and c.name_movie='Dracula'
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,您需要使用 EXISTS 编写相同的查询

      应该是这样的:

      SELECT c.name_channel, c.company_channel, c.URL_channel
      FROM Channel c
        where EXISTS (
      select * from Schedule_Channel s where s.name_channel = c.name_channel
          and s.starting_date > to_date('20151101 00:00:00','YYYYMMDD HH24:MI:SS') 
          and EXISTS (select * from Movie m
            where m.num_movie = s.num_movie
              and m.name_movie = 'Dracula'
          ))
      

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        相关资源
        最近更新 更多