• Try this...

    declare @date datetime

    set @date = round(cast(getdate() as float),0,1)

    SELECT

    A.a_id,

    C.c_id,

    B.b_id,

    D.d_id,

    E.e_id,

    F.g_id

    FROM table_G G

    INNER JOIN

    table_A A

    ON A.a_id = G.a_id and a.Created < @date

    INNER JOIN

    table_C C

    ON C.c_id = G.c_id

    LEFT JOIN

    table_B B

    ON B.a_id = A.a_id

    LEFT JOIN

    table_D D

    ON D.b_id = B.b_id AND D.c_id = G.c_id

    LEFT JOIN

    table_E E

    ON E.e_id = COALESCE(D.e_id, C.e_id)

    LEFT JOIN

    table_F F

    ON F.g_id = G.g_id

    WHERE

    F.g_id IS NULL

    In general, it is better to put conditions (where possible) into inline views instead of the where clause. That way, the number of rows is determined before the potentially billions of other rows introduced by the joins are considered. Also, if you're computing a value, do it in a variable before you put it in a join - it's a kazillion times faster. Another good way would be

    declare @date datetime

    set @date = round(cast(getdate() as float),0,1)

    SELECT

    A.a_id,

    C.c_id,

    B.b_id,

    D.d_id,

    E.e_id,

    F.g_id

    FROM table_G G

    INNER JOIN

    (select * from table_A where created < @date) A

    ON A.a_id = G.a_id

    INNER JOIN

    table_C C

    ON C.c_id = G.c_id

    LEFT JOIN

    table_B B

    ON B.a_id = A.a_id

    LEFT JOIN

    table_D D

    ON D.b_id = B.b_id AND D.c_id = G.c_id

    LEFT JOIN

    table_E E

    ON E.e_id = COALESCE(D.e_id, C.e_id)

    LEFT JOIN

    table_F F

    ON F.g_id = G.g_id

    WHERE

    F.g_id IS NULL

    if you don't like inline views.