这是我的电影桌:
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%';
但是输出仅显示经典类型的所有类型,而不是浪漫经典。 此外,我必须完成一个查询,但是我不知道如何将它们组合在一起。
答案 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中通常区分大小写,因此您可能还需要考虑大写/小写。