2016-07-28 4 views
3

У меня есть несколько таблиц с внешним ключом из основной таблицы. Таблицы, как это:Как объединить несколько строк из нескольких таблиц Эффективно

Сестры

MainID IDNO .... 
111111  1 ....   
111111  1 ....   
111111  1 .... 
222222  1 ....   
111111  2 ....   

Братья

MainID IDNO .... 
111111  555 ....   
111111  333 ....   
111111  111 .... 
222222  222 ....   
111111  321 ....   

Дяди

MainID IDNO .... 
111111  561 ....   
111111  121 ....   
111111  331 .... 
222222  451 ....   
111111  672 .... 

Мне нужно Concat Enate все IDNo s в, но я не могу показаться, чтобы получить все, как, например, может быть, я не могу получить 672

SELECT 
    ',' + S1.IDNo + ',' + B1.IDNo + ',' + U1.IDNo AS [text()] 
FROM 
    Sisters S1, Brothers B1, Uncles U1, MainTable 
WHERE 
    D1.MainID = MainTable.ID 
    AND S1.MainID = MainTable.ID 
    AND B1.MainID = MainTable.ID 
FOR XML PATH('') 

Я попытался отделить столы и concanate позже, но это становится гораздо медленнее, что путь. Что я могу сделать?

Ожидаемый результат:

,1,1,1,1,2,555,333,111,222,321,561,121,331,451,672 
+0

FYI : maintable имеет около 200 000 записей, а подтаблицы имеют около 600 000 каждый. – jackjop

+5

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет ** назад) и его использование обескуражено –

+0

@marc_s Я использовал соединения слишком быстро, не слишком много, – jackjop

ответ

1

на основе ожидаемого выхода он появляется, что столбец MainID в каждой из 3-х таблиц не имеет права голоса на выходе (если так), то это должно работать вы, хотя я не уверен, что он будет масштабироваться для обработки записей 600K +. Из любопытства, почему вы хотите объединить такой большой список ценностей?

Declare @x as varchar(max) = '' 

SELECT @x = @x + ',' + CAST(A.IDNO as varchar) FROM 
(
select 1 as IDNO UNION ALL 
select 2 as IDNO UNION ALL 
select 3 as IDNO UNION ALL 
select 4 as IDNO 
) A -- Pretend this is your Sisters tables 
FOR XML PATH('') 
PRINT @X -- Just for Debugging Purposes 

SELECT @x = @x + ',' + CAST(B.ID as varchar) FROM 
(
select 55 as IDNO UNION ALL 
select 66 as IDNO UNION ALL 
select 77 as IDNO UNION ALL 
select 88 as IDNO 
) B -- Pretend this is your Brothers tables 

PRINT @X -- Just for Debugging Purposes 

SELECT @x = @x + ',' + CAST(C.IDNO as varchar) FROM 
(
select 555 as IDNO UNION ALL 
select 666 as IDNO UNION ALL 
select 777 as IDNO UNION ALL 
select 888 as IDNO 
) C -- Pretend this is your Uncles tables 


PRINT @X -- Final Output 
SELECT @X as XML_Output FOR XML PATH('') 

Выход:

,1,2,3,4 
,1,2,3,4,55,66,77,88 
,1,2,3,4,55,66,77,88,555,666,777,888 -- Final Result 

<XML>,1,2,3,4,55,66,77,88,555,666,777,888</XML> -- XML Output 

Так что в вашем случае, если вы могли бы сделать что-то вроде этого (опять-таки не уверен, как он будет вести себя на больших столах):

Declare @x as varchar(max) = '' 
SELECT @x = @x + ',' + CAST(A.IDNO as varchar) FROM 
(
select MainID , IDNO FROM SISTERS UNION ALL 
select MainID , IDNO FROM BROTHERS UNION ALL 
select MainID , IDNO FROM UNCLES 
) A 


SELECT @X as XML_Output FOR XML PATH('') 
+0

ну, я хочу этот список, потому что клиент хочет найти основной элемент с idno из подтабликов. хотя я не знаю, есть ли другой способ, самое разумное, что мне пришло в голову. Пример; если при поиске клиента '555' в идентификаторах я должен отображать основной элемент с идентификатором № 111111, учитывая ситуацию в моем вопросе. – jackjop