2014-02-05 6 views
1

У меня есть два сценария, которые создают следующие две таблицы (t1 и t2). Есть ли способ слияния t1 и t2, чтобы сделать t3? Первые 5 строк каждой таблицы имеют одинаковое значение в первом столбце (Число). Однако в t1 столбцы PreOpOrg и PreOpModality заполнены, но в t2 они являются NULL, и наоборот для столбцов PostOpOrg и PostOpModality. Таким образом, слияние будет заполнять столбцы значениями, отличными от NULL, из каждой таблицы (t1 и t2). Для строк в t1 и t2, которые появляются только в одной таблице, они должны появляться в t3, как если бы был предпринят попыток обычного UNION. К сожалению, пока я работаю в SQL2005, сценарий должен быть совместим с SQL2000. Большое спасибо.Сравнение и объединение двух таблиц в SQL Server 2005

--t1 

    Number   DateOfBirth    PreOpOrg PreOpModality PostOpOrg PostOpModality DiagDate 
    8643576344  01/04/1935 00:00:00 RBA11  2    NULL  NULL   04/09/2012 00:00 
    2345680016  01/01/1960 00:00:00 RBA11  4    NULL  NULL   11/11/2011 00:00 
    6955934252  20/01/1980 00:00:00 RBA11  4    NULL  NULL   22/08/2012 00:00 
    2234582369  28/12/1940 00:00:00 RBA11  5    NULL  NULL   02/11/2011 00:00 
    9477684368  01/02/1959 00:00:00 RBA11  5    NULL  NULL   02/01/2014 00:00 

    --t2 

    Number   DateOfBirth    PreOpOrg PreOpModality PostOpOrg PostOpModality DiagDate 
    8643576344  01/04/1935 00:00:00 NULL  NULL   RBA11  2    04/09/2012 00:00 
    2345680016  01/01/1960 00:00:00 NULL  NULL   RBA11  2    11/11/2011 00:00 
    6955934252  20/01/1980 00:00:00 NULL  NULL   RN325  5    22/08/2012 00:00 
    2234582369  28/12/1940 00:00:00 NULL  NULL   RBA11  5    02/11/2011 00:00 
    9477684368  01/02/1959 00:00:00 NULL  NULL   RBA11  5    02/01/2014 00:00 
    0000001564  01/01/1970 00:00:00 NULL  NULL   RBA11  2    08/08/2012 00:00 
    4225127842  11/07/1948 00:00:00 NULL  NULL   RBA11  2    10/09/2011 00:00 
    0909093842  01/07/1957 00:00:00 NULL  NULL   RN325  5    26/08/2009 00:00 
    8528528855  05/12/1969 00:00:00 NULL  NULL   RBA11  5    25/10/2010 00:00 
    1000001367  05/05/1950 00:00:00 NULL  NULL   RBA11  5    08/04/2011 00:00 
    2234573513  30/11/1946 00:00:00 NULL  NULL   RN325  5    20/04/2011 00:00 
    1000001566  18/03/1951 00:00:00 NULL  NULL   RBA11  5    20/03/2012 00:00 
    0000001600  01/01/1970 00:00:00 NULL  NULL   RBA11  5    28/03/2013 00:00 
    1000001621  12/12/1950 00:00:00 NULL  NULL   RBA11  5    06/12/2013 00:00 

    --t3  

    Number   DateOfBirth    PreOpOrg PreOpModality PostOpOrg PostOpModality DiagDate 
    8643576344  01/04/1935 00:00:00 RBA11  2    RBA11  2    04/09/2012 00:00 
    2345680016  01/01/1960 00:00:00 RBA11  4    RBA11  2    11/11/2011 00:00 
    6955934252  20/01/1980 00:00:00 RBA11  4    RN325  5    22/08/2012 00:00 
    2234582369  28/12/1940 00:00:00 RBA11  5    RBA11  5    02/11/2011 00:00 
    9477684368  01/02/1959 00:00:00 RBA11  5    RBA11  5    02/01/2014 00:00 
    0000001564  01/01/1970 00:00:00 NULL  NULL   RBA11  2    08/08/2012 00:00 
    4225127842  11/07/1948 00:00:00 NULL  NULL   RBA11  2    10/09/2011 00:00 
    0909093842  01/07/1957 00:00:00 NULL  NULL   RN325  5    26/08/2009 00:00 
    8528528855  05/12/1969 00:00:00 NULL  NULL   RBA11  5    25/10/2010 00:00 
    1000001367  05/05/1950 00:00:00 NULL  NULL   RBA11  5    08/04/2011 00:00 
    2234573513  30/11/1946 00:00:00 NULL  NULL   RN325  5    20/04/2011 00:00 
    1000001566  18/03/1951 00:00:00 NULL  NULL   RBA11  5    20/03/2012 00:00 
    0000001600  01/01/1970 00:00:00 NULL  NULL   RBA11  5    28/03/2013 00:00 
    1000001621  12/12/1950 00:00:00 NULL  NULL   RBA11  5    06/12/2013 00:00 

ответ

2

Учитывая ваши данные и требования к работе на SQL 2000, я предоставляю вам решение ниже.
Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы. Для моего удобства я добавил только несколько записей из вашего примера. Если вы используете SQL Server 2008 или более высокую версию, вы можете использовать функцию COALESCE, как описано here.

create table t1 
(
Number VARCHAR(10), 
DateOfBirth DATETIME, 
PreOpOrg VARCHAR(10), 
PreOpModality INT, 
PostOpOrg VARCHAR(10), 
PostOpModality INT, 
DiagDate DATETIME 
) 

create table t2 
(
Number VARCHAR(10), 
DateOfBirth DATETIME, 
PreOpOrg VARCHAR(10), 
PreOpModality INT, 
PostOpOrg VARCHAR(10), 
PostOpModality INT, 
DiagDate DATETIME 
) 

INSERT INTO T1 values (8643576344,'01/04/1935 00:00:00','RBA11',2,NULL,NULL,'04/09/2012 00:00'), 
(2345680016,'01/01/1960 00:00:00','RBA11',4,NULL,NULL,'11/11/2011 00:00') 

INSERT INTO T2 values ('8643576344','01/04/1935 00:00:00',NULL,NULL,'RBA11',2,'04/09/2012 00:00'), 
('0000001564','01/01/1970 00:00:00',NULL,NULL,'RBA11',2,'08/08/2012 00:00'), 
('2345680016','01/01/1960 00:00:00',NULL,NULL,'RBA11',2,'11/11/2011 00:00') 


SELECT * FROM T1 
SELECT * FROM T2 


SELECT CASE WHEN T1.Number IS NOT NULL THEN T1.Number ELSE T2.NUMBER END AS Number, 
CASE WHEN T1.DateOfBirth IS NOT NULL THEN T1.DateOfBirth ELSE T2.DateOfBirth END AS DateOfBirth, 
CASE WHEN T1.PreOpOrg IS NOT NULL THEN T1.PreOpOrg ELSE T2.PreOpOrg END AS PreOpOrg, 
CASE WHEN T1.PreOpModality IS NOT NULL THEN T1.PreOpModality ELSE T2.PreOpModality END AS PreOpModality, 
CASE WHEN T1.PostOpOrg IS NOT NULL THEN T1.PostOpOrg ELSE T2.PostOpOrg END AS PostOpOrg, 
CASE WHEN T1.PostOpModality IS NOT NULL THEN T1.PostOpModality ELSE T2.PostOpModality END AS PostOpModality, 
CASE WHEN T1.DiagDate IS NOT NULL THEN T1.DiagDate ELSE T2.DiagDate END AS DiagDate 
FROM T1 
RIGHT JOIN T2 ON T1.Number = T2.Number 
+0

Махмад Ходжи - спасибо за это решение, это работает, и я реализовал его. Что касается функции coalesce, я думал, что вы можете использовать ее в SQL2000? См. Объяснение на этой [link] (http://technet.microsoft.com/en-us/library/aa258244%28v=sql.80%29.aspx) –

+0

Пожалуйста, отметьте это как ответ. Благодарю. –

2

Другим решением может быть

SELECT 
     ISNULL(T1.Number, T2.NUMBER) AS Number 
     ,ISNULL(T1.DateOfBirth, T2.DateOfBirth) AS DateOfBirth 
     ,ISNULL(T1.PreOpOrg, T2.PreOpOrg) AS PreOpOrg 
     ,ISNULL(T1.PreOpModality, T2.PreOpModality) AS PreOpModality 
     ,ISNULL(T1.PostOpOrg, T2.PostOpOrg) AS PostOpOrg 
     ,ISNULL(T1.PostOpModality, T2.PostOpModality) AS PostOpModality 
     ,ISNULL(T1.DiagDate, T2.DiagDate) AS DiagDate 
    FROM T1 
    RIGHT JOIN T2 
     ON T1.Number = T2.Number 
Смежные вопросы