Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Сравнение двух таблиц в базе данных   Найти похожие ветки 

 
Lis'S   (2006-06-24 11:01) [0]

Господа, помогите! Горю! Есть 2 таблицы, в них пять полей (лиц. счёт, ФИО и год. рождения). Необходимо сравнить эти две таблицы на наличие в них неправильных данных. Т.е. если хотя бы один символ не будет совпадать, то нужно вывести эту запись в таблицу ошибок. Я сделал примитивный вариант, когда записи находятся, так сказать, друг напротив друга, но этот вариант не катит, так как данные могут быть в любом месте таблицы. Пробовал прописывать через while not Table1.Eof сравнивает только с первой записью.


 
Курдль ©   (2006-06-24 11:47) [1]

Само по себе наличие 2-х разных таблиц с одинаковыми данными говорит о грубом нарушении принципов построения реляционных БД.


 
Lis'S   (2006-06-24 12:08) [2]

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


 
Savek   (2006-06-24 12:28) [3]

var
   qr1,qr2 : TADOQery;

....
//Загружаем проверяемую таблицу
qr1.SQL.Clear;
qr1.SQL.Add("...");
...
qr1.Open;

//в цикле проверяем наличие данных в эталоне

while not qr1.eof do begin
    whith qr2 do begin
        SQL.Clear;
        SQL.Add("select * from Эталон where Field1=:F1 ....");
        Parameters.ParamByName("F1").value:=qr1.FieldByName("Field1");
        ....
        Open;
        if IsEmpty then begin
        // если запрос пустой значит такой записи в эталоне нет, здесь запись ошибки
        end;      
    end;
qr2.Next;
end;


 
Курдль ©   (2006-06-24 13:01) [4]

Первичный ключ-то в таблицах есть? Например лицевой счет
Он должен совпадать в обеих таблицах? Или у программы должно быть чисто ассоциативное мышление типа "если в первой таблице есть запись Иван Иваныч Пупкин", то во второй "Иван Иваныч Папкин" - это ошибка?

Во втором случае - надо подумать, а в первом - даже думать не надо!


 
Курдль ©   (2006-06-24 13:17) [5]

Ладно, я сегодня добрый - приведу пример для первого варианта, когда ПК все-таки есть:


select * from TABLE1 T1, TABLE2 T2
where T1.ACCOUNT = T2.ACCOUNT
and (T1.FIO <> T2.FIO or T1.DATE <> T2.DATE)


 
Lis'S   (2006-06-24 13:49) [6]

Для примера Лицевой счёт:

Эталон:
00012 Иванов Иван Иванович 1914

Проверяемая таблица:
00012 Иванов Иван Иванович 1914
00015 Иванов Иван Иванович 1914

Т.е. лицевой счёт в проверяемой таблице у одного и того же человека открыт два раза - это считается ошибкой.

Для примера Фамилия:
Эталон:
00012 Иванов Иван Иванович 1914

Проверяемая таблица:
00012 Ивонов Иван Иванович 1914

Т.е. в фамилии не совпадает одна буква, что тоже считается ошибкой.


 
Курдль ©   (2006-06-24 14:17) [7]


> Для примера Фамилия:
> Эталон:
> 00012 Иванов Иван Иванович 1914
>
> Проверяемая таблица:
> 00012 Ивонов Иван Иванович 1914
>
> Т.е. в фамилии не совпадает одна буква, что тоже считается
> ошибкой.


А если реально есть клиент с фамилией Ивонов, то ошибка ведь будет в счете!

Вам "в консерватории надо что-то подправить" (с).
Так программы с БД не делаются.
При такой постановке вопроса должны быть хотя бы 2 таблицы: клиентов и счетов. В первой не должен повториться ни один клиент (вероятность ничтожна, что найдутся 2 полных тезки с одной датой рождения). А вторая должна быть связана с первой в соотв. с Вашей бизнес-логикой (один-к-одному, один-ко-многим).
В Вашем случае автоматизация бессмысленна, пока данные не будут приведены в поорядок. Так что открывайте Excel и ручками ищите ошибки.


 
SergP.   (2006-06-24 19:35) [8]

Как я понял нужно в одной таблице отыскать все записи, которые не присутствуют в другой (в эталоне).


 
ЮЮ ©   (2006-06-26 03:50) [9]

SELECT e.*, t.*
FROM
 EtalonTable.*
 FULL JOIN TestTable t ON
 (e.ACCOUNT = t.ACCOUNT) AND (e.FIO = t.FIO) AND ...
WHERE
 (e.ACCOUNT IS NULL) OR (t.ACCOUNT IS NULL)



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.06 c
15-1154963169
GeLLeR
2006-08-07 19:06
2006.09.03
Для тех, кто играл в NFS Most Wanted


2-1153935200
Tanya
2006-07-26 21:33
2006.09.03
Запись в текстовый файл


1-1149819265
tButton
2006-06-09 06:14
2006.09.03
оптимизация: что быстрее?


15-1154760816
McSimm
2006-08-05 10:53
2006.09.03
Пункт 2 правил форума


9-1134733120
julai
2005-12-16 14:38
2006.09.03
Статьи по OpenGL