2012-04-17 4 views
1

У меня около 15 таблиц, каждая из которых содержит около 10 столбцов и почти 1 миллион строк данных.Как добавить таблицы «Боковые» в SQL

Все 15 таблиц имеют одинаковые первичные ключи, которые я могу использовать для их объединения.

Например ..
Таблица 1 - Столбцы ABCDE
Таблица 2 - Столбцы ABFGH
Таблица 3 - Столбцы ABIJK
Таблица 4 - Столбцы ABLMN
и т.д .. где А & В являются первичные ключи

что мне нужно будет один огромный стол, который выглядит следующим образом ..
mainTable - Столбцы АБВГДЕЖ ... MN

Прямо сейчас, что я сделал:
- Начните с таблицы 1 в качестве моей «главной» таблицы
- Измените таблицу, чтобы добавить все столбцы .. (т. F G H .. L M N)
- использовать команду UPDATE для заполнения в "основной" таблицы

update mainTable set 
F = a.F, 
G = a.G, 
H = a.H 
from mainTable left join Table2 a on 
mainTable.A = a.A and 
mainTable.B = a.B 

(rinse and repeat for each of the 15 tables) 

Это, кажется, работает, просто, что это ужасно неэффективно. Требуется возраст, чтобы присоединиться к одной таблице.

Есть ли альтернативный/более быстрый способ выполнения этой задачи?

+0

Почему вы используете 'LEFT JOIN'? Это заставит значения «NULL», если соответствующие клавиши не существуют в таблице2 * (и таблице3 и т. Д.) *. Это верно? Кроме того, знаете ли вы, что каждый ключ из 'mainTable' существует только * (не более) * один раз, в других таблицах? Далее * (а также частично в ответ на последний вопрос) *, есть ли у вас индексы и/или ограничения первичного ключа, применяемые во всех таблицах? Обеспечение быстрого соединения? Наконец, есть причина, по которой вы не можете сделать все это одним обновлением с помощью 'main LEFT JOIN LEFT JOIN b LEFT JOIN c и т. Д. И т. Д.?? – MatBailie

+0

Привет, Dems, я уверен, что соответствующие ключи существуют во всех таблицах и что ключ в mainTable уникален. Ограничения основного ключа не применяются в этой таблице, и я не слишком уверен, что вы подразумеваете под быстрым подключением. Я мог бы сделать все это одним массовым обновлением, но когда я пробую его всего за 2 таблицы, для завершения обновления уже требуется 15-25 минут. Вот почему я здесь ищу более эффективную альтернативу – d0h

+0

Что я имею в виду заключается в том, что без индекса или ограничения первичного ключа в каждой из ваших таблиц соединения будут очень медленными. Это похоже на вырывание миллиона страниц из книги и прошу вас сопоставить их с миллионами страниц, вырванных из другой книги. Если они помещены в один и тот же порядок, это тривиальная работа. Если они разбросаны aroudn (без индекса или ограничения PK), тогда вы сойдете с ума. – MatBailie

ответ

0

Обновления часто медленнее, чем вставки. Скорее создайте новую таблицу и вставьте в нее все данные.

+0

Что делать, если существуют ограничения внешнего ключа, ссылающиеся на эту таблицу и т. Д.? – MatBailie

+0

Изменение внешних ключей для ссылки на новую таблицу. Затем замените старые таблицы на представления. –

+0

Я попытался создать таблицу и вставить, и возникла проблема с максимальным размером группы первичных файлов. (Я использую SQL Server Express). Во всяком случае, в конце концов я решил просто выбрать все поля по 15 таблицам и щелкнуть правой кнопкой мыши> Сохранить результаты как> в CSV-файл, который затем я импортировал обратно в новую базу данных, во вновь созданную «главную» таблицу. Все еще импортируя, когда я печатаю это, надеюсь, что на этот раз ошибок нет! – d0h

1

Один из вариантов я могу думать:

CREATE TABLE data 
(
    A <some format> NOT NULL, 
    B <some format> NOT NULL, 
    C <some format> NOT NULL CONSTRAINT DF_data_C DEFAULT (' '), 
    D <some format> NOT NULL CONSTRAINT DF_data_D DEFAULT (' '), 
    ... 
    N <some format> NOT NULL CONSTRAINT DF_data_N DEFAUT (' ') 
) 

Хорошо, а теперь у вас есть таблица со всеми необходимыми столбцами. Поскольку вставки не мешают друг другу, просто вставьте все данные импорта в большую таблицу. Одна вещь, которую нужно проверить, - это пространство, так как эта таблица обязательно велика в конце с миллионами строк.

Затем, чтобы закончить его «двигаться» данные из данных таблицы в таблицу основной с помощью предложения GROUP BY: вставить в главную SELECT, A, B, Макс (С), Макс (D), Макс (Е), Макс. (F) ... Макс. (N) Из данных GROUP BY A, B

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

+0

Интересная идея есть. Сначала я попробую предложение Энтони, так как это требует меньше шагов. Мой первоначальный метод использования UPDATE, по-видимому, медленнее экспоненциально с каждой добавленной таблицей. – d0h

0

Вы можете просто использовать отборное в так:

SELECT 
     T1.A, T1.B, T1.C, 
     T2.D, T2.E, T2.F, 
     T3.G, T3.H 
    INTO NewTable 
    FROM 
     T1 
     inner join T2 on T1.A = T2.A and T1.B = T2.B 
     inner join T3 on T1.A = T3.A and T1.B = T3.B 
      ORDE BY A,B -- If this will become your PK 

Тогда вам просто нужно изменить таблицу, чтобы добавить необходимые показатели:

ALTER TABLE NewTable ADD CONSTRAINT PK_NewTable PRIMARY KEY CLUSTERED (A,B) 

Это будет работать, только если все таблицы имеют ту же комбинацию A, B.Если это варьируется от таблицы к таблице, вам нужно другое решение:

SELECT 
     T1.A, T1.B, T1.C, 
     T2.D, T2.E, T2.F, 
     T3.G, T3.H 
    INTO NewTable 
    FROM 
    (SELECT DISTINCT A,B FROM 
    (SELECT A,B FROM T1 
     UNION SELECT A,B FROM T2 
     UNION SELECT A,B FROM T3) ALL) T0 
     inner join T1 on T0.A = T1.A and T0.B = T1.B 
     inner join T2 on T0.A = T2.A and T0.B = T2.B 
     inner join T3 on T0.A = T3.A and T0.B = T3.B 
Смежные вопросы