Как мне присоединить неизвестное количество строк к другой строке? - PullRequest
3 голосов
/ 14 декабря 2010

У меня есть такой сценарий:

Таблица A:

---------------
ID| SOME_VALUE|
---------------
1 | 123223    |
2 | 1232ff    |
---------------

Таблица B:

------------------
ID | KEY | VALUE |
------------------
23 | 1   | 435   |
24 | 1   | 436   |
------------------

KEY - это ссылка на идентификатор таблицы A.Могу ли я как-то объединить эти таблицы, чтобы получить следующий результат:

Таблица C

-------------------------
ID| SOME_VALUE|    |    |
-------------------------
1 | 123223    |435 |436 |
2 | 1232ff    |    |    |
-------------------------

Таблица C должна иметь любое количество столбцов в зависимости от того, сколько совпадающих значенийнаходятся в таблице B.

Надеюсь, этого достаточно, чтобы объяснить, что я здесь ищу.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Чтобы сделать это, вам нужно использовать динамическое PIVOT предложение.

РЕДАКТИРОВАТЬ:

Хорошо, поэтому я немного поэкспериментировал и наследующие примеры данных:

Create Table TableA
(
IDCol int,
SomeValue varchar(50)
)
Create Table TableB
(
IDCol int,
KEYCol int,
Value varchar(50)
)

Insert into TableA
Values (1, '123223')
Insert Into TableA
Values (2,'1232ff')
Insert into TableA
Values (3, '222222')

Insert Into TableB
Values( 23, 1, 435)
Insert Into TableB
Values( 24, 1, 436)

Insert Into TableB
Values( 25, 3, 45)
Insert Into TableB
Values( 26, 3, 46)

Insert Into TableB
Values( 27, 3, 435)
Insert Into TableB
Values( 28, 3, 437)

Вы можете выполнить следующий динамический SQL.

declare @sql varchar(max)
declare @pivot_list varchar(max)
declare @pivot_select varchar(max)

Select 
        @pivot_list = Coalesce(@Pivot_List + ', ','') + '[' + Value +']',
        @Pivot_select = Coalesce(@pivot_Select, ', ','') +'IsNull([' + Value +'],'''') as [' + Value + '],'
From 
(
Select distinct Value From dbo.TableB 
)PivotCodes

Set @Sql = '
;With p as (

Select a.IdCol,
        a.SomeValue,
        b.Value
From dbo.TableA a
Left Join dbo.TableB b on a.IdCol = b.KeyCol
)
Select IdCol, SomeValue ' + Left(@pivot_select, Len(@Pivot_Select)-1) + '
From p
Pivot ( Max(Value) for Value in (' + @pivot_list + '
        )
    )as pvt
'

exec (@sql)

Это даст следующий вывод:

alt text

Хотя в данный момент это работает, поддерживать его было бы кошмаром.Я бы порекомендовал попытаться достичь этих результатов где-нибудь еще.т.е. не в SQL!

Удачи!

2 голосов
/ 14 декабря 2010

Как наглядно иллюстрирует Барри , можно получить несколько столбцов с помощью динамического центра.

У меня есть решение, которое может дать вам то, что вам нужно, за исключением того, чтовсе значения в одном столбце VARCHAR.Если вы можете разделить эти результаты, то вы можете получить то, что вам нужно.

Этот метод представляет собой хитрость в SQL Server 2005, которую можно использовать для формирования строки из столбца значений.

CREATE TABLE #TableA (
   ID INT,
   SomeValue VARCHAR(50)
);
CREATE TABLE #TableB (
   ID INT,
   TableAKEY INT,
   BValue VARCHAR(50)
);

INSERT INTO #TableA VALUES (1, '123223');
INSERT INTO #TableA VALUES (2, '1232ff');
INSERT INTO #TableA VALUES (3, '222222');

INSERT INTO #TableB VALUES (23, 1, 435);
INSERT INTO #TableB VALUES (24, 1, 436);
INSERT INTO #TableB VALUES (25, 3,  45);
INSERT INTO #TableB VALUES (26, 3,  46);
INSERT INTO #TableB VALUES (27, 3, 435);
INSERT INTO #TableB VALUES (28, 3, 437);

SELECT
   a.ID
   ,a.SomeValue
   ,RTRIM(bvals.BValues) AS ValueList
FROM #TableA AS a
OUTER APPLY (
   -- This has the effect of concatenating all of
   -- the BValues for the given value of a.ID.
   SELECT b.BValue + ' ' AS [text()]
   FROM #TableB AS b
   WHERE a.ID = b.TableAKEY
   ORDER BY b.ID
   FOR XML PATH('')
) AS bvals (BValues)
ORDER BY a.ID
;

В результате вы получите:

ID  SomeValue  ValueList
--- ---------- --------------
1   123223     435 436
2   1232ff     NULL
3   222222     45 46 435 437
0 голосов
/ 14 декабря 2010

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

Тем не менее, если у вас есть таблица A и B; я рекомендую придерживаться этих двух таблиц; как они кажутся довольно нормализованными. Если вам нужен список b.value с входными данными a.some_value, следующий SQL-запрос даст этот список.

выберите значение b.value из a, b, где b.key = a.id a.some_value = 'INPUT_VALUE';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...