как объединить две или более таблицы и результирующий набор, имеющий все различные значения - PullRequest
0 голосов
/ 10 ноября 2009

У меня есть около 20 файлов Excel, содержащих данные. все таблицы имеют одинаковые столбцы, такие как возраст имени и т. д. и т. д. ..... у каждого файла разные данные, но я не знаю, повторяются ли данные в одном файле в другом файле. поэтому я хочу объединить все файлы, и результат st должен содержать различные значения. пожалуйста, помогите мне с этой проблемой как можно скорее. Я хочу, чтобы набор результатов был сохранен в базе данных доступа.

Ответы [ 5 ]

1 голос
/ 10 ноября 2009

Я бы рекомендовал либо связывать листы в доступе, либо импортировать листы в виде таблиц.

Затем попытайтесь с помощью DISTINCT выбрать из таблиц / листов требуемые ключи и выбрать записи только по необходимости.

0 голосов
/ 03 сентября 2015

Объединение - объединение двух таблиц путем сопоставления значений в соответствующих столбцах. В результате вы получите объединенную таблицу, которая состоит из первой таблицы и совпавших строк, скопированных из второй таблицы. Вы можете использовать DIGBD надстройку для Excel

0 голосов
/ 10 ноября 2009

Кажется, уникальный набор данных, который вам нужен, это:

SELECT T1.name, T1.loc
  FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db1.xls;
       ].[Sheet1$] AS T1
UNION 
SELECT T1.name, T1.loc
  FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db2.xls;
       ].[Sheet1$] AS T1

... но затем вы хотите произвольно применить последовательность целых чисел как id (вместо использования значений id из таблиц Excel).

Поскольку Access Database Engine не поддерживает общие выражения таблиц, а Excel не поддерживает VIEW s, вам придется повторить этот запрос UNION как производные таблицы (надеюсь, оптимизатор распознает повтор? используя коррелированный подзапрос, чтобы получить номер строки:

SELECT (
        SELECT COUNT(*) + 1
          FROM (
                SELECT T1.name, T1.loc
                  FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db1.xls;
                       ].[Sheet1$] AS T1
                UNION 
                SELECT T1.name, T1.loc
                  FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db2.xls;
                       ].[Sheet1$] AS T1
               ) AS DT1
         WHERE DT1.name < DT2.name
       ) AS id, 
       DT2.name, DT2.loc
  FROM (
        SELECT T2.name, T2.loc
          FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db1.xls;
               ].[Sheet1$] AS T2
        UNION 
        SELECT T2.name, T2.loc
          FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=C:\db2.xls;
               ].[Sheet1$] AS T2
       ) AS DT2;

Примечание:

я хочу, чтобы набор результатов был сохранен в база данных доступа

Тогда, возможно, вам следует перенести данные Excel в промежуточную таблицу в вашей базе данных Access и выполнить очистку данных оттуда. По крайней мере, вы можете поместить эту производную таблицу в VIEW:)

0 голосов
/ 10 ноября 2009

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

select id, name, age, location from Table1
union
select id, name, age, location from Table2
union
select id, name, age, location from Table3
union
...

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

insert into ResultTable
select id, name, age, location from Table1
union
....

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

insert into ResultTable
select t.id, t.name, t.age, t.location from Table1 as t
left join ResultTable as r on r.id = t.id
where r.id is null

(Предполагается, что id - это уникальное поле, идентифицирующее запись.)

0 голосов
/ 10 ноября 2009

В SQL вы можете использовать JOIN или NATURAL JOIN для объединения таблиц. Я бы посмотрел в NATURAL JOIN, так как вы сказали, что все таблицы имеют одинаковые значения.

После этого вы можете использовать DISTINCT для получения различных значений.

Я не уверен, что это то, что вы ищете, хотя: ваш вопрос касается Excel, но вы пометили его SQL.

...