Reputation: 23
I've searched for hours with no specific answer to my problem.
I have two tables, for example:
Table A
DateAndTime ms us F1 F2 F3
2012-07-07 00:00:00.000 0 0 1 1 1
2012-07-07 01:07:40.000 750 361 1 0 1
2012-07-07 01:07:41.000 50 11 1 0 1
2012-07-07 01:08:35.000 850 998 1 0 0
2012-07-07 01:08:36.000 50 83 1 0 0
2012-07-07 01:08:59.000 250 26 0 0 0
Table B
DateAndTime ms us F4 F5 F6
2012-07-07 00:00:00.000 0 0 1869 11 2247
2012-07-07 00:00:00.000 0 588 1869 15 2247
2012-07-07 00:05:14.000 987 359 1869 13 2251
2012-07-07 00:05:16.000 45 493 1869 11 2247
2012-07-07 00:14:15.000 985 557 1869 11 2157
2012-07-07 00:14:16.000 945 179 1869 11 2279
The result I'm looking for is to merge these two tables:
Result Table
DateAndTime ms us F1 F2 F3 F4 F5 F6
2012-07-07 00:00:00.000 0 0 1 1 1 1869 11 2247
2012-07-07 00:00:00.000 0 588 NULL NULL NULL 1869 15 2247
2012-07-07 00:05:14.000 987 359 NULL NULL NULL 1869 13 2251
2012-07-07 00:05:16.000 45 493 NULL NULL NULL 1869 11 2247
2012-07-07 00:14:15.000 985 557 NULL NULL NULL 1869 11 2157
2012-07-07 00:14:16.000 945 179 NULL NULL NULL 1869 11 2279
2012-07-07 01:07:40.000 750 361 1 0 1 NULL NULL NULL
2012-07-07 01:07:41.000 50 11 1 0 1 NULL NULL NULL
2012-07-07 01:08:35.000 850 998 1 0 0 NULL NULL NULL
2012-07-07 01:08:36.000 50 83 1 0 0 NULL NULL NULL
2012-07-07 01:08:59.000 250 26 0 0 0 NULL NULL NULL
The PRIMARY KEY in both tables is made up of (DateAndTime, ms, us).
If both tables have the same primary key then the data can be merged into the same row, otherwise there should just be new rows with NULLs where there is no data.
The column names are not always the same so I would have to build the query dynamically using C# and then execute it. I'm just trying to do as much of the work on the SQL server side before I start processing the data in C#.
Upvotes: 0
Views: 252
Reputation: 11355
Use the below for SQL server or MY SQL
SELECT T1.DATEANDTIME,
T1.MS,
T1.US,
T1.F1,
T1.F2,
T1.F3,
T2.F4,
T2.F5,
T2.F6
FROM T1
LEFT OUTER JOIN
T2
ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US )
UNION
SELECT T2.DATEANDTIME,
T2.MS,
T2.US,
T1.F1,
T1.F2,
T1.F3,
T2.F4,
T2.F5,
T2.F6
FROM T1
RIGHT OUTER JOIN
T2
ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US );
This is for Oracle
WITH T1
AS (SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
'0' AS MS,
'0' AS US,
'1' AS F1,
'1' AS F2,
'1' AS F3
FROM DUAL
UNION ALL
SELECT '2012-07-07 01:07:40.000' AS DATEANDTIME,
'750' AS MS,
'361' AS US,
'1' AS F1,
'0' AS F2,
'1' AS F3
FROM DUAL
UNION ALL
SELECT '2012-07-07 01:07:41.000' AS DATEANDTIME,
'50' AS MS,
'11' AS US,
'1' AS F1,
'0' AS F2,
'1' AS F3
FROM DUAL
UNION ALL
SELECT '2012-07-07 01:08:35.000' AS DATEANDTIME,
'850' AS MS,
'998' AS US,
'1' AS F1,
'0' AS F2,
'0' AS F3
FROM DUAL
UNION ALL
SELECT '2012-07-07 01:08:36.000' AS DATEANDTIME,
'50' AS MS,
'83' AS US,
'1' AS F1,
'0' AS F2,
'0' AS F3
FROM DUAL
UNION ALL
SELECT '2012-07-07 01:08:59.000' AS DATEANDTIME,
'250' AS MS,
'26' AS US,
'0' AS F1,
'0' AS F2,
'0' AS F3
FROM DUAL),
T2
AS (SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
'0' AS MS,
'0' AS US,
'1869' AS F4,
'11' AS F5,
'2247' AS F6
FROM DUAL
UNION ALL
SELECT '2012-07-07 00:00:00.000' AS DATEANDTIME,
'0' AS MS,
'588' AS US,
'1869' AS F4,
'15' AS F5,
'2247' AS F6
FROM DUAL
UNION ALL
SELECT '2012-07-07 00:05:14.000' AS DATEANDTIME,
'987' AS MS,
'359' AS US,
'1869' AS F4,
'13' AS F5,
'2251' AS F6
FROM DUAL
UNION ALL
SELECT '2012-07-07 00:05:16.000' AS DATEANDTIME,
'45' AS MS,
'493' AS US,
'1869' AS F4,
'11' AS F5,
'2247' AS F6
FROM DUAL
UNION ALL
SELECT '2012-07-07 00:14:15.000' AS DATEANDTIME,
'985' AS MS,
'557' AS US,
'1869' AS F4,
'11' AS F5,
'2157' AS F6
FROM DUAL
UNION ALL
SELECT '2012-07-07 00:14:16.000' AS DATEANDTIME,
'945' AS MS,
'179' AS US,
'1869' AS F4,
'11' AS F5,
'2279' AS F6
FROM DUAL)
SELECT T1.DATEANDTIME,
T1.MS,
T1.US,
T1.F1,
T1.F2,
T1.F3,
T2.F4,
T2.F5,
T2.F6
FROM T1
LEFT OUTER JOIN
T2
ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US )
UNION
SELECT T2.DATEANDTIME,
T2.MS,
T2.US,
T1.F1,
T1.F2,
T1.F3,
T2.F4,
T2.F5,
T2.F6
FROM T1
RIGHT OUTER JOIN
T2
ON ( T1.DATEANDTIME = T2.DATEANDTIME AND T1.MS = T2.MS AND T1.US = T2.US );
Which produce
2012-07-07 00:00:00.000 0 0 1 1 1 1869 11 2247
2012-07-07 00:00:00.000 0 588 1869 15 2247
2012-07-07 00:05:14.000 987 359 1869 13 2251
2012-07-07 00:05:16.000 45 493 1869 11 2247
2012-07-07 00:14:15.000 985 557 1869 11 2157
2012-07-07 00:14:16.000 945 179 1869 11 2279
2012-07-07 01:07:40.000 750 361 1 0 1
2012-07-07 01:07:41.000 50 11 1 0 1
2012-07-07 01:08:35.000 850 998 1 0 0
2012-07-07 01:08:36.000 50 83 1 0 0
2012-07-07 01:08:59.000 250 26 0 0 0
Note: UNION removes duplicates. I don't use full outer join since it is not supported across all DB's
Upvotes: 0
Reputation: 1921
try below query..
SELECT A.DATEANDTIME,A.MS,A.US,A.F1,A.F2,A.F3,B.F4,B.F5,B.F6 FROM TABLEA A FULL OUTER JOIN TABLEB B ON A.DATEANDTIME = B.DATEANDTIME
UNION
SELECT B.DATEANDTIME,B.MS,B.US,A.F1,A.F2,A.F3,B.F4,B.F5,B.F6 FROM TABLEA A FULL OUTER JOIN TABLEB B ON A.DATEANDTIME = B.DATEANDTIME
Upvotes: 1