Tables:
DECLARE @Customer TABLE
(
CustomerID integer PRIMARY KEY
)
DECLARE @Address TABLE
(
AddressID integer PRIMARY KEY NONCLUSTERED,
CustomerID integer NOT NULL,
FromDate date NOT NULL,
ToDate date NOT NULL,
UNIQUE CLUSTERED (CustomerID, AddressID)
)
DECLARE @Email TABLE
(
EmailID int PRIMARY KEY NONCLUSTERED,
CustomerID integer NOT NULL,
FromDate date NOT NULL,
ToDate date NOT NULL,
UNIQUE CLUSTERED (CustomerID, EmailID)
)
Test data:
INSERT @Customer
(CustomerID)
VALUES
(1)
INSERT @Address
(AddressID, CustomerID, FromDate, ToDate)
VALUES
(1, 1, '2000-01-01', '2005-12-31'),
(2, 1, '2006-01-01', '9999-12-31')
INSERT @Email
(EmailID, CustomerID, FromDate, ToDate)
VALUES
(1, 1, '2000-01-01', '2005-12-31'),
(2, 1, '2006-01-01', '2011-12-31'),
(3, 1, '2012-01-01', '9999-12-31')
Query:
SELECT
T1.CustomerID,
T1.AddressID,
T1.EmailID,
T1.FromDate,
T1.ToDate
FROM
(
SELECT
c.CustomerID,
a.AddressID,
e.EmailID,
(SELECT MAX(U.FromDate) FROM (VALUES (a.FromDate), (e.FromDate)) AS U (FromDate)) AS FromDate,
(SELECT MIN(U.ToDate) FROM (VALUES (a.ToDate), (e.ToDate)) AS U (ToDate)) AS ToDate
FROM @Customer AS c
LEFT JOIN @Address AS a ON
a.CustomerID = c.CustomerID
LEFT JOIN @Email AS e ON
e.CustomerID = c.CustomerID
) AS T1
WHERE
T1.FromDate <= T1.ToDate
Output:
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi