Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.038 c
1-1153521032
Батя
2006-07-22 02:30
2006.09.03
WebBrowser


2-1155562900
Слон
2006-08-14 17:41
2006.09.03
Нужна помощь с заданием.


2-1155310398
Demand
2006-08-11 19:33
2006.09.03
Внешний IP


15-1154946124
Сатир
2006-08-07 14:22
2006.09.03
Проблема с загрузкой письма в компонент Indy


15-1154682457
Ketmar
2006-08-04 13:07
2006.09.03
алгоритм Диффи-Хэллмана на чистом Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский