连接一些列内容并在一个查询中选择

时间:2019-03-23 07:54:37

标签: sql oracle

这是我的电影桌:

FILM (Catalog_Num, Format, Title, Year, Number_Discs, Rating, Timing, Genre)

如果年份在1970年之前且无法重复,我想将流派列连接起来, 例如,如果流派是浪漫->(经典浪漫)就可以了。

但是类型已经是Classic,应该保持Classic,而不是(Classic Classic)

在那之后,我必须列出所有经典电影的ID,标题和流派。

这是我尝试过的:

select genre|| 'Classic'
from film where (year <1970 and genre not in ('Classic'));

select film_id, title, genre
from inventory, film
where film.catalog_num = inventory.catalog_num and genre like '%Classic%';

但是输出仅显示经典类型的所有类型,而不是浪漫经典。 此外,我必须完成一个查询,但是我不知道如何将它们组合在一起。

2 个答案:

答案 0 :(得分:2)

使用子查询来处理数据并将其提供给您的主查询:

with films as ( 
     select catalog_num 
            , title
            , case
               when (year <1970 and genre not in ('Classic'))
               then 'Classic ' || genre
               else genre end as genre
           from film
  )
select inventory.film_id
       , films.title
       , films.genre
from inventory
     join films on films.catalog_num = inventory.catalog_num
where  films.genre like '%Classic%';

您的问题是说您想要浪漫->(经典浪漫),但是您发布的代码中有genre||'Classic,反之亦然。我更改了代码以生成“经典浪漫”。


注意:您没有在第二个查询的投影中为列加上别名,因此我不得不猜测哪些列来自film,哪些列来自inventory。您将需要纠正任何错误的猜测。

答案 1 :(得分:1)

如果您只想定义一流的电影,那么您就不必再为这种类型而烦恼了。只要做:

select i.film_id, f.title, f.genre
from inventory i join
     films f
     on f.catalog_num = i.catalog_num
where f.genre like '%Classic%' or f.year < 1970;

如果您仍然想要流派“经典”:

select i.film_id, f.title,
       (case when f.year < 1970 and f.genre <> 'Classic'
             then 'Classic ' || f.genre
             else f.genre
        end) as genre
from inventory i join
     films f
     on f.catalog_num = i.catalog_num
where f.genre like '%Classic%' or f.year < 1970;

对于“经典”是否可以作为流派名称的一部分而不是整个名称,您的问题有点模糊。所以您可能想要:

       (case when f.year < 1970 and f.genre not like '%Classic%'
             then 'Classic ' || f.genre
             else f.genre
        end) as genre

请注意,此类比较在Oracle中通常区分大小写,因此您可能还需要考虑大写/小写。