Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Склеить таблицы по ключевому полю  [new]
Kst75
Member

Откуда:
Сообщений: 3
Добрый вечер!
Может кто подскажет, как склеить две похожие таблицы в одну,
но что бы в результате full join'а не размножались значения там где не надо?
(SQL сервер 2000)

Например:
CREATE TABLE #T1 (Code_ID INT, NAME_1 VARCHAR(255))
CREATE TABLE #T2 (Code_ID INT, NAME_2 VARCHAR(255))

INSERT INTO #T1(Code_ID, NAME_1)
SELECT 1,  'AAA_1' UNION ALL
SELECT 4,  'WWW_1' UNION ALL
SELECT 7,  'DDD_1' UNION ALL
SELECT 4,  'WWW_1' UNION ALL
SELECT 5,  'KKK_1' UNION ALL
SELECT 9,  'PPP_1' UNION ALL
SELECT 1,  'AAA_1'

INSERT INTO #T2(Code_ID, NAME_2)
SELECT 2,  'FFF_2' UNION ALL
SELECT 3,  'SSS_2' UNION ALL
SELECT 9,  'PPP_2' UNION ALL
SELECT 9,  'PPP_2' UNION ALL
SELECT 4,  'WWW_2'


Вид после соединения такой:
--------------------------------------
Code_ID | NAME_1 | Code_ID | NAME_2  |
--------------------------------------
NULL      NULL       2		FFF_2
NULL      NULL       3		SSS_2
1	  AAA_1	    NULL	NULL
1	  AAA_1	    NULL	NULL
4	  WWW_1	     4		WWW_2
4	  WWW_1	    NULL	NULL
5	  KKK_1	    NULL	NULL
7	  DDD_1	    NULL	NULL
9	  PPP_1	     9		PPP_2
NULL      NULL       9		PPP_2
24 окт 12, 17:23    [13370198]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Размножение-то где?

Сообщение было отредактировано: 24 окт 12, 17:31
24 окт 12, 17:31    [13370256]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
для 2000 чет кроме union + case по верху ниче придумать не могу
24 окт 12, 17:33    [13370272]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гавриленко Сергей Алексеевич
Размножение-то где?
Наверно, две девятки имеются в виду
Они в примере считаются разными почему-то...

Kst75, пронумеровать ROW_NUMBER()ом внутри одинаковых Code_ID,
и в FULL JOIN к сравнению по Code_ID добавить сравнение полученных номеров
24 окт 12, 17:37    [13370291]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Kst75
Member

Откуда:
Сообщений: 3
Размножение возникает так:
-------------------------------
Code_ID	NAME_1	Code_ID	NAME_2 |
-------------------------------
9	PPP_1	9	PPP_2
9	PPP_1	9	PPP_2

А должно быть так:
-------------------------------
Code_ID	NAME_1	Code_ID	NAME_2 |
-------------------------------
9	PPP_1	9	PPP_2
NULL	NULL	9	PPP_2
24 окт 12, 17:37    [13370292]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
ROW_NUMBER()

невзлетит потому что
автор
(SQL сервер 2000)
24 окт 12, 17:38    [13370295]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Kst75,

ето у вас какето собственная логика - вы ее на бумажке нарисуйте и сразу стент ясно что надо по факту
iap -правильно сказал ,результаты надо пронумеровать и сранить патом
24 окт 12, 17:40    [13370308]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Kst75,

SELECT t1.*, t2.*
FROM 
    (
    SELECT Code_ID cc
    FROM #T1  
    UNION  
    SELECT Code_ID
    FROM #T2  
    ) T
    LEFT JOIN #T1 AS t1 
    ON T.cc =t1.Code_ID

    LEFT JOIN #T2 AS t2
    ON T.cc =t2.Code_ID
24 окт 12, 17:40    [13370309]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Maxx
для 2000 чет кроме union + case по верху ниче придумать не могу
2000-й сервер не увидел
Ну тогда в обе таблицы добавить поле с IDENTITY, пронумеровать записи для одинаковых Code_ID,
подсчитывая для них COUNT(*) для ID, меньших текущего. В FULL JOIN добавить сравнение этих COUNT(*)ов
24 окт 12, 17:40    [13370311]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
Kst75
Member

Откуда:
Сообщений: 3
Всем огромное спасибо за ответы!
Я как то изначально об использовании ранжированя не думал в виду 2000,
рассчитывал выкрутиться так ... суть решения проблемы понятна.
Спасибо!
24 окт 12, 17:50    [13370369]     Ответить | Цитировать Сообщить модератору
 Re: Склеить таблицы по ключевому полю  [new]
j12
Guest
Kst75,
Вот решение.

CREATE TABLE #T1 (id int IDENTITY(1,1) , Code_ID INT, NAME_1 VARCHAR(255))
CREATE TABLE #T2 (id int IDENTITY(1,1), Code_ID INT, NAME_2 VARCHAR(255))

INSERT INTO #T1(Code_ID, NAME_1)
SELECT 1,  'AAA_1' UNION ALL
SELECT 4,  'WWW_1' UNION ALL
SELECT 7,  'DDD_1' UNION ALL
SELECT 4,  'WWW_1' UNION ALL
SELECT 5,  'KKK_1' UNION ALL
SELECT 9,  'PPP_1' UNION ALL
SELECT 1,  'AAA_1'

INSERT INTO #T2(Code_ID, NAME_2)
SELECT 2,  'FFF_2' UNION ALL
SELECT 3,  'SSS_2' UNION ALL
SELECT 9,  'PPP_2' UNION ALL
SELECT 9,  'PPP_2' UNION ALL
SELECT 4,  'WWW_2'

---Для  SQL от 2005
FROM 
    (
    SELECT 

    ROW_NUMBER()OVER (PARTITION BY Code_ID ORDER BY Code_ID) AS n,
    Code_ID cc
    FROM #T1  
    UNION  
    SELECT ROW_NUMBER()OVER (PARTITION BY Code_ID ORDER BY Code_ID),Code_ID
    FROM #T2  
    ) T
    LEFT JOIN (SELECT ROW_NUMBER()OVER (PARTITION BY Code_ID ORDER BY Code_ID) AS n1,* FROM #T1) AS t1 
    ON T.cc =t1.Code_ID
    AND T.n = t1.n1

    LEFT JOIN (SELECT ROW_NUMBER()OVER (PARTITION BY Code_ID ORDER BY Code_ID) AS n2,* FROM #T2) AS t2
    ON T.cc =t2.Code_ID
    AND T.n = t2.n2
       
---Для Любого SQL    
    SELECT t11.Code_ID,t11.NAME_1, t22.Code_ID,t22.NAME_2
    FROM 
        (
         SELECT 
        (SELECT COUNT (*) FROM #T1 tt1 WHERE tt1.id <= t1.id AND tt1.Code_ID = t1.Code_ID) n,
        Code_ID cc
        FROM #T1 t1 
        UNION
        SELECT  
        (SELECT COUNT (*) FROM #T2 tt2 WHERE tt2.id <= t2.id AND tt2.Code_ID = t2.Code_ID) n,
        Code_ID
        FROM #T2 t2 
        ) T
        LEFT JOIN (SELECT (SELECT COUNT (*) FROM #T1 tt1 WHERE tt1.id <= t1.id AND tt1.Code_ID = t1.Code_ID) n1,* FROM #T1 t1) AS t11 
            ON T.cc =t11.Code_ID
                AND T.n = t11.n1

        LEFT JOIN (SELECT (SELECT COUNT (*) FROM #T2 tt2 WHERE tt2.id <= t2.id AND tt2.Code_ID = t2.Code_ID) n2,* FROM #T2 t2) AS t22
            ON T.cc =t22.Code_ID
                AND T.n = t22.n2 
25 окт 12, 09:32    [13372282]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить