• 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.