Хорошо, это немного страннее, чем я думал, но я думаю, это то, что вы хотите. Возможно, это не самый чистый способ получить результаты, но это начало?
DECLARE @parent TABLE (ROWID INT, ID INT, CHILDID INT, FLAG CHAR(1));
INSERT INTO @parent
SELECT 1, 10, 1000, 'A'
UNION ALL
SELECT 2, 10, 1001, 'A'
UNION ALL
SELECT 3, 10, 1002, 'A'
UNION ALL
SELECT 4, 11, 1005, 'A'
DECLARE @child TABLE (ROWID INT, ID INT, EFFECTIVEDATE DATETIME, SHARES INT);
INSERT INTO @child
SELECT 2, 10, '20010101 00:00', 20
UNION ALL
SELECT 1, 11, '20020101 00:00', 60
UNION ALL
SELECT 3, 1000, '20010101 00:00', 30
UNION ALL
SELECT 4, 1005, '20020101 00:00', 50
UNION ALL
SELECT 5, 1005, '20040101 00:00', 90;
SELECT DISTINCT
c1.*
FROM
@child c1
INNER JOIN @parent p1 ON p1.ID = c1.ID
INNER JOIN @child c2 ON c2.ID = p1.CHILDID
WHERE
c2.EFFECTIVEDATE = c1.EFFECTIVEDATE
UNION ALL
SELECT DISTINCT
c2.*
FROM
@child c1
INNER JOIN @parent p1 ON p1.ID = c1.ID
INNER JOIN @child c2 ON c2.ID = p1.CHILDID
WHERE
c2.EFFECTIVEDATE = c1.EFFECTIVEDATE
ORDER BY
1;
Результаты:
ROWID ID EFFECTIVEDATE SHARES
1 11 2002-01-01 00:00:00.000 60
2 10 2001-01-01 00:00:00.000 20
3 1000 2001-01-01 00:00:00.000 30
4 1005 2002-01-01 00:00:00.000 50
Да, а эти DISTINCT
, вероятно, излишни?