Поиск одинаковых записей в нескольких таблицах

ramon105
Дата: 31.10.2009 22:35:41
Доброго времени суток.

Подскажите пожалуйста как в ситуации лучше поступить.
Есть база данных с более чем десятком таблиц. У всех таблиц есть поле ИНН.
Как можно сделать выборку записей, которые есть более чем в одной таблице (т.е. может быть так, что ИНН в таблице уникален и других нет, а может быть так, что есть в 5-6 таблицах)?

У самого есть пока два варианта и оба тупых:
1) делать запросы перебором (1 и 2 таблица, 1 и 3, 1 и 4, 1 и 5 и т.д.)
2) объеденить их в одну таблицу, отсортировать по этому полю и циклом пройтись по таблице сравнивая текущую строку с последующей и если одинаковы, то оставлять. разные - удалять). Правда совсем ни разу не приходилось программировать в access.


Заранее большое спасибо.
Владимир Саныч
Дата: 31.10.2009 22:58:15
select inn from (
select inn from table1
union all
select inn from table2
union all
select inn from table3
union all
...
union all
select inn from tableN
) group by inn
where count(inn)>1
mds_world
Дата: 31.10.2009 22:58:53
Так можно найти повторяющиеся значения
Select ИНН from
(select ИНН from ПерваяТаблица
Union All
select ИНН from ВтораяТаблица
Union All
select ИНН from ТретяяТаблица
Union All
select ИНН from ЧетветаяТаблица
.............
Union All
select ИНН from ПоследняяТаблица) s
Group by ИНН
Having Count(*)>1
Назовем этот запрос q1.
Следующим запросом можно узнать в каких таблицах повторяющиеся номера

Select ИНН, Название from
(select ИНН, "ПерваяТаблица" as Название from ПерваяТаблица
Union All
select ИНН, "ВтораяТаблица" as Название  from ВтораяТаблица
Union All
select ИНН, "ТретяяТаблица" as Название  from ТретяяТаблица
Union All
select ИНН, "Четветая" as Название  from ЧетветаяТаблица
.............
Union All
select ИНН, "ПоследняяТаблица" as Название  from ПоследняяТаблица) s
Where ИНН in (select ИНН from q1)
Владимир Саныч
Дата: 31.10.2009 23:11:31
Уже вижу, в чем я напахал.
ramon105
Дата: 31.10.2009 23:47:31
Большое спасибо! Все работает
Guest33
Дата: 01.11.2009 00:46:16
1) q2: Все объединяем, но без группировки
SELECT tbl, clng(inn) AS vInn, inn AS zInn
FROM (select "t1"as tbl ,inn from i1
Union All
select "t2",inn from i2
Union All
select "t3",inn from i3
) AS s;

2) qw: вспомогательный запрос, аналогичный запросу mds_world'а
SELECT q2.vInn AS INN
FROM q2
GROUP BY q2.vInn
HAVING (((Count(q2.vInn))>1));

3) q3: Перекрестный запрос с вычислением какой-либо агрегатной функции (предполагаем, что ИНН можно преобразовать в длинное целое). Заголовки строк - значения ИНН, столбцов - имена таблиц.
TRANSFORM Avg(q2.vInn) AS [Avg-vInn]
SELECT q2.zInn
FROM q2
GROUP BY q2.zInn
PIVOT q2.tbl;

4) q4: Убираем лишнее, объединяя запросы qw и q3
SELECT q3.*
FROM qw INNER JOIN q3 ON qw.inn=q3.zInn;

На выходе получаем таблицу, в которой заполнены только те ячейки, в которых совпадают ИНН
Уважающий ВсехВас
Дата: 01.11.2009 03:59:43
ramon105
Доброго времени суток.

Подскажите пожалуйста как в ситуации лучше поступить.
Есть база данных с более чем десятком таблиц. У всех таблиц есть поле ИНН.
Как можно сделать выборку записей, которые есть более чем в одной таблице (т.е. может быть так, что ИНН в таблице уникален и других нет, а может быть так, что есть в 5-6 таблицах)?

У самого есть пока два варианта и оба тупых:
1) делать запросы перебором (1 и 2 таблица, 1 и 3, 1 и 4, 1 и 5 и т.д.)
2) объеденить их в одну таблицу, отсортировать по этому полю и циклом пройтись по таблице сравнивая текущую строку с последующей и если одинаковы, то оставлять. разные - удалять). Правда совсем ни разу не приходилось программировать в access.


Заранее большое спасибо.


Вот ответьте честно-вопрос по нормированию БД прорабатовали?
Или промолчите?
ramon105
Дата: 01.11.2009 11:47:39
Уважающий ВсехВас,

отвечу честно, что даже не знаю что это такое. Я не технарь. БД оно не будет использоваться хоть сколько-то долго. Есть лишь одна задача - выявить схожие записи в представленных из разных мест таблицах. После этого она будет удалена.
ВАТМАН
Дата: 14.09.2011 17:46:33
CREATE TABLE table1 (
id INTEGER NOT NULL PRIMARY KEY,
city VARCHAR(10) NOT NULL);
CREATE TABLE table2 (
id INTEGER NOT NULL PRIMARY KEY,
city VARCHAR(10) NOT NULL);
CREATE TABLE table3 (
city VARCHAR(10) NOT NULL);
INSERT INTO table1 VALUES (1, 'RIGA');
INSERT INTO table1 VALUES (2, 'RIGA');
INSERT INTO table1 VALUES (3, 'RIGA');
INSERT INTO table1 VALUES (4, 'TALLINN');
INSERT INTO table1 VALUES (5, 'TALLINN');
INSERT INTO table1 VALUES (6, 'TALLINN');
INSERT INTO table1 VALUES (7, 'VILNIUS');
INSERT INTO table1 VALUES (8, 'HELSINKI');
INSERT INTO table1 VALUES (9, 'HELSINKI');
INSERT INTO table1 VALUES (10, 'STOCKHOLM');
INSERT INTO table2 VALUES (1, 'RIGA');
INSERT INTO table2 VALUES (2, 'RIGA');
INSERT INTO table2 VALUES (3, 'VILNIUS');
INSERT INTO table2 VALUES (4, 'VILNIUS');
INSERT INTO table2 VALUES (5, 'VILNIUS');
INSERT INTO table2 VALUES (6, 'VILNIUS');
INSERT INTO table2 VALUES (7, 'HELSINKI');
COMMIT;


SELECT city FROM table1
INTERSECT
SELECT city FROM table2;

SELECT city FROM table1
INTERSECT
SELECT city FROM table3;
ВАТМАН
Дата: 14.09.2011 17:47:40