• You could try this

    ;WITH cte AS (

    SELECT a.itemid, a.date

    , 0 level

    , null parentid

    , a.itemid rootid, a.date rootdate

    , CASE WHEN EXISTS(SELECT 1 FROM @tableB k WHERE a.itemid = k.parentid) THEN 1 ELSE null END hasKiddies

    FROM @tableA a

    WHERE NOT EXISTS (SELECT 1 FROM @tableB b WHERE a.itemid = b.itemid)

    UNION ALL

    SELECT b.itemid, ab.date

    , level + 1 level

    , b.parentid

    ,a.rootid, a.rootdate

    , CASE WHEN EXISTS(SELECT 1 FROM @tableB k WHERE b.itemid = k.parentid) THEN 1 ELSE null END hasKiddies

    FROM cte a

    INNER JOIN @tableB b ON a.itemid = b.parentid

    INNER JOIN @tableA ab ON ab.itemid = b.itemid

    WHERE a.hasKiddies = 1

    )

    SELECT itemid, date

    FROM cte

    ORDER by rootdate, rootid, level , date

    Sorry it's a bit ugly, but it should handle same dates and also multiple levels