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