Как объединить две таблицы в SQL Server с одним общим столбцом, но без лишних данных - PullRequest
0 голосов
/ 14 июля 2011

Таблица A:

id  members      
____________
1    a
2    b
3    c
4    c
4    d
5    e

Таблица B

id  countries
_____________
1   us
1   europe
1   australia
3   india
3   china
4   australia
4   canada
5   mexico

Результат должен выглядеть следующим образом:

id   members   countries
___________________________
1     a        us
1              europe
1              australia
2     b
3     c        india
3              china
4     c        australia
4     d        cananda
5     e         mexico

Извините, если редактирую не в том месте.

@ Martin Спасибо за ваш ответ.Отлично работает на 2 столах.Но на самом деле я пытаюсь объединить более 2. Допустим, у меня есть другая таблица C

id     prime_members
---------------------
1       p1
1       p2

Мне нужен результат, чтобы выглядеть как

id   members   countries     prime_mem
___________________________________________
1     a        us            p1
1              europe        p2
1              australia
2     b
3     c        india
3              china
4     c        australia
4     d        cananda
5     e         mexico

, поэтому я попробовал запрос, как этот

 ;WITH A AS 
( SELECT id, members,
 ROW_NUMBER() OVER (PARTITION BY id ORDER BY members) AS RN FROM @A ),
  B AS 
  ( SELECT id, countries, 
  ROW_NUMBER() OVER (PARTITION BY id ORDER BY countries) AS RN FROM @B ),
   C AS 
  ( SELECT id,PRIME_MEM,
  ROW_NUMBER() OVER (PARTITION BY id ORDER BY PRIME_MEM) AS RN FROM @C )

   SELECT COALESCE(A.id,B.id,C.ID) AS id,  A.members, B.countries,C.PRIME_MEM
    FROM A FULL OUTER JOIN B on A.id = B.id AND A.RN=B.RN
    FULL OUTER JOIN C  ON A.ID =C.ID AND C.RN = A.RN 

тогда я получил такой результат:

id   members   countries     prime_mem
___________________________________________
1     a        us            p1
1              europe        
1              australia
1                            p2
2     b
3     c        india
3              china
4     c        australia
4     d        cananda
5              mexico

Я понял, что C.RN=B.RN дает правильный вывод, потому что A.RN не имеет RN>1 каку него только 1 ряд.Здесь это легко, потому что только 3 таблицы и несколько строк.Но в режиме реального времени как выяснить и решить эту проблему.Также таблица A является справочной таблицей, то есть значения для ID в таблицах B и C будут присутствовать в таблице A.

Любая помощь приветствуется.Спасибо.

1 Ответ

2 голосов
/ 14 июля 2011

В таблицах нет «естественного порядка», поэтому (если нет дополнительного столбца, такого как id, который вы нам не показали), нет ничего, что можно было бы использовать для того, чтобы обеспечить порядок в исходных данных вашего примера. будет сохранен в окончательном выводе.

;WITH A AS
(
SELECT id,
       members, 
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY members) AS RN
FROM tableA
),
B AS
(
SELECT id,
       countries, 
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY countries) AS RN
FROM tableB
)
SELECT COALESCE(A.id,B.id) AS id, 
       A.members,
       B.countries
FROM A FULL OUTER JOIN B on A.id = B.id AND A.RN=B.RN

Возвраты (обратите внимание, что Китай и Индия поменялись местами в порядке моих ответов в алфавитном порядке в каждой группе)

id          members countries
----------- ------- ---------
1           a       australia
1           NULL    europe
1           NULL    us
2           b       NULL
3           c       china
3           NULL    india
4           c       australia
4           d       canada
5           NULL    mexico
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...