Соедините три таблицы в общем столбце - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть три таблицы с именами Table1, Table2 и Table3.В таблице 1 есть столбцы (mobNum bigint, посещения США DateTime).Таблица 2 имеет столбцы (mobNum bigint, visitUK DateTime).В таблице 3 есть столбцы (mobNum bigint ,itedChina DateTime).Пример данных выглядит следующим образом:

Table1

___________________________       
    mobnum | visitedUS
___________________________ 
9000000001 |  20/10/18  
___________________________ 
9000000001 | 11/07/19  
___________________________ 
9000000002 | 01/02/17
___________________________

Table2

    mobnum | visitedUK
___________________________ 
9000000001 | 03/05/19  
___________________________ 
9000000002 |10/10/18  
___________________________

Table3

    mobnum | visitedChina
___________________________ 
9000000001 | 15/03/18 
___________________________ 

Теперь я хочу, чтобы SQL-запрос показывал результат какниже

              Result Table
   -------------------------------------------------------
   mobnum      | visitedUS    | visitedUK  | visitedChina  
   -------------------------------------------------------
     9000000001|20/10/18      |  03/05/19  |  15/03/18    
   -------------------------------------------------------
     9000000001|11/07/19      |  Null      |   Null       
   -------------------------------------------------------
     9000000002|01/02/17      | 10/10/18   |   Null       
   -------------------------------------------------------

Ответы [ 5 ]

2 голосов
/ 23 сентября 2019

Я не проверял или не проверял орфографию / синтаксис:

select 
    isnull(t1.mobnum,isnull(t2.mobnum,t3.mobnum)) mobnum,
    t1.visitedUS, 
    t2.visitedUK, 
    t3.visitedChina
from Table1 t1
full outer join Table2 t2 on t1.mobnum = t2.mobnum
full outer join Table3 t3 on t3.mobnum = isnull(t1.mobnum,t2.mobnum)
1 голос
/ 23 сентября 2019

Только мои 2 цента, решение с более чистым решением состоит в том, чтобы использовать colesce вместо нескольких ISNULL:

SELECT COALESCE(t1.mobnum, t2.mobnum, t3.mobnum) mobnum,
       t1.visitedUS,
       t2.visitedUK,
       t3.visitedChina
FROM Table1 t1
    FULL OUTER JOIN Table2 t2 ON t1.mobnum = t2.mobnum
    FULL OUTER JOIN Table3 t3 ON t3.mobnum = ISNULL(t1.mobnum, t2.mobnum);
1 голос
/ 23 сентября 2019
CREATE TABLE [dbo].[Table1](
    [mobnum] [bigint] NULL,
    [visitedUS] [date] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2](
    [mobnum] [bigint] NULL,
    [visitedUK] [date] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Table3](
    [mobnum] [bigint] NULL,
    [visitedChina] [date] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Table1] ([mobnum], [visitedUS]) VALUES (9000000001, CAST(N'2018-10-20' AS Date))
GO
INSERT [dbo].[Table1] ([mobnum], [visitedUS]) VALUES (9000000002, CAST(N'2018-10-30' AS Date))
GO
INSERT [dbo].[Table2] ([mobnum], [visitedUK]) VALUES (9000000001, CAST(N'2018-11-10' AS Date))
GO
INSERT [dbo].[Table2] ([mobnum], [visitedUK]) VALUES (9000000003, CAST(N'2018-11-25' AS Date))
GO
INSERT [dbo].[Table3] ([mobnum], [visitedChina]) VALUES (9000000001, CAST(N'2018-12-01' AS Date))
GO
INSERT [dbo].[Table3] ([mobnum], [visitedChina]) VALUES (9000000004, CAST(N'2018-12-10' AS Date))
GO

теперь проверьте с помощью следующего запроса

SELECT ISNULL(t1.mobnum, ISNULL(t2.mobnum, t3.mobnum)) mobnum,
       t1.visitedUS,
       t2.visitedUK,
       t3.visitedChina
FROM Table1 t1
    FULL OUTER JOIN Table2 t2
        ON t1.mobnum = t2.mobnum
    FULL OUTER JOIN Table3 t3
        ON t3.mobnum = ISNULL(t1.mobnum, t2.mobnum);
0 голосов
/ 23 сентября 2019

Попробуйте это:

with table1rn(mobnum, visitedUS, rn) as
(
select *, row_number() over(partition by mobnum order by visitedUS) rn
from table1
),
table2rn(mobnum, visitedUK, rn) as
(
select *, row_number() over(partition by mobnum order by visitedUK) rn
from table2
),
table3rn(mobnum, visitedChina, rn) as
(
select *, row_number() over(partition by mobnum order by visitedChina) rn
from table3
)
select t1.mobnum, t1.visitedUS, t2.visitedUK, t3.visitedChina
from table1rn t1
left join table2rn t2 on t2.mobnum = t1.mobnum and t2.rn = t1.rn
left join table3rn t3 on t3.mobnum = t1.mobnum and t3.rn = t1.rn
0 голосов
/ 23 сентября 2019

FULL OUTER JOIN будет создавать забавные наборы результатов, когда у вас есть несколько строк в каждой таблице.Лучший способ решить эту проблему использует union all, row_number() и group by:

select mobnum,
       max(visitedUS) as visitedUS,
       max(visitedUK) as visitedUK,
       max(visitedChina) as visitedChina
from ((select mobnum, visitedUS, null as visitedUS, null as visitedChina,
              row_number() over (partition by mobnum order by visitedUS) as seqnum
       from table1
      ) union all
      (select mobnum, null as visitedUS, visitedUK, null as visitedChina,
              row_number() over (partition by mobnum order by visitedUK) as seqnum
       from table2
      ) union all
      (select mobnum, null as visitedUS, null as visitedUK, visitedChina,
              row_number() over (partition by mobnum order by visitedChina) as seqnum
       from table1
      )
     ) v
group by mobnum, seqnum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...