Yes, you can follow the same track.
CREATE table categoria(
[id_categoria] [int] NOT NULL,
[categoria] [nvarchar](50) NULL
);
INSERT INTO categoria
VALUES
(1, 'horror'),
(2, 'fantascienza');
CREATE table film(
[id_film] [int] NOT NULL,
[film] [nvarchar](50) NULL,
[fk_categoria] [int] NULL
);
INSERT INTO film
VALUES
(1,'titolo 1', 1),
(2,'titolo 2', 1),
(3,'titolo 3', 2);
CREATE TABLE [dbo].[sub_film](
[id_sub_film] [int] NOT NULL,
[sub_titolo] [varchar](50) NULL,
[fk_film] [int] NULL
);
INSERT INTO sub_film
VALUES
(1,'sub_titolo 2.0', 2),
(2,'sub_titolo 2.1', 2),
(2,'sub_titolo 3.0', 3)
;
select title from
(
select f.[fk_categoria], f.[id_film], [id_sub_film], title= replicate(' ',6)+[sub_titolo]
from sub_film as sf
join film as f on sf.[fk_film] = f.[id_film]
union all
select [fk_categoria], [id_film], null, title= replicate(' ',3)+[film]
from film
union all
select
[id_categoria], null, null, title = [categoria]
from categoria
) as t
order by [fk_categoria], [id_film], [id_sub_film]
A word of caution. You haven't declared any foreign key. And referencing columns are nullable. You should either correct it or decide on where should 'orphan' films and subfilms go and rewrite the query accordingly.