2010-12-14 2 views
3

У меня этот сценарий:Как присоединить неизвестное количество строк к другой строке?

Таблица A:

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

Таблица B:

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

КЛЮЧ является ссылкой на идентификатор таблицы, в. Могу ли я каким-то образом соединить эти таблицы, так что я получаю следующий результат:

Таблица C

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

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

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

Спасибо.

+0

лично я бы изменить дизайн. Таблицы с ключевыми значениями - очень сложный проект, чтобы работать эффективно и правильно. Если вам действительно нужны пары ключевого значения, то реляционная база данных может быть не лучшим местом для их хранения. База данных noSQL может быть лучшим выбором. – HLGEM

+0

Да, я знаю, что это не отличный способ решить эту проблему, но мне это нужно только один раз, и это не будет реализовано ни в одном приложении. – picknick

ответ

3

Для этого вам необходимо использовать предложение Dynamic PIVOT.

EDIT:

Ok так что я сделал некоторые игры вокруг и на основе следующих данных выборки:

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!

Удачи вам!

+0

Спасибо! Я согласен с точкой «не в SQL», но это было всего лишь одно время. – picknick

0

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

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

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

2

Как хорошо показано, можно получить несколько столбцов, используя динамический стержень.

У меня есть решение, которое может получить то, что вам нужно, за исключением того, что оно помещает все значения в один столбец 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

Я действительно закончил с вашим решением, но принятый ответ был ближе к моему первоначальному вопросу. Благодаря! – picknick

+0

Все в порядке. Я разработал решение, найденное в принятом ответе, и, как говорит автор, он эффективен, но это кошмар для обслуживания. – eksortso

Смежные вопросы