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

Вниз

Как проверить что две таблицы одинаковы   Найти похожие ветки 

 
yaric   (2005-01-04 11:54) [0]

У меня 2 таблицы с одинаковым набором полей и с разными названиями Table1, Table2. Вопрос как сравнить 2 таблицы на равенство. Под равенством будем понимать полное совпадение данных как в первой так и во второй таблице. Скажите если у кого какие идеи по этому поводу возникли.


 
Плохиш ©   (2005-01-04 11:56) [1]

TFields
Eof, Next,
while not eof do
for i := 0 to xxx.FieldsCount - 1 do
=


 
msguns ©   (2005-01-04 11:58) [2]

Вывести все записи и таблицы 1-й, которые имеют ID, отличный от списка, полученного в результате выборки из 1-й таблицы, связанной со второй условием равенства всех полей.
Получишь кол-во записей 1-й таблицы, не совпадающих со 2-й.
Аналогично с точностью до наоборот для 2-й таблицы.
Неоптимально, зато красиво !


 
yaric   (2005-01-04 12:02) [3]

А запросом внутри хранимой процедуры как
не на клиенте


 
yaric   (2005-01-04 12:04) [4]

А пооптимальней. и чтобы с использованием COUNT(*)


 
msguns ©   (2005-01-04 12:05) [5]

Не делай так как советует Плохиш ©   (04.01.05 11:56) [1]
Плохо советует ;)

В ХП вставь 2 запроса, как я написал. И возвращай два параметра - кол-во оригинальных в 1 и 2 таблицах. Если оба - 0, то идентичны. Либо возвращай объединенный датасет с признаком таблицы, относительно которой делался запрос.


 
yaric   (2005-01-04 12:07) [6]

//Либо возвращай объединенный датасет с признаком таблицы, относительно которой делался запрос

Это как?


 
msguns ©   (2005-01-04 12:14) [7]

UNION


 
yaric   (2005-01-04 12:19) [8]

а внутри хранимой процедуры UNION пройдет


 
Sandman25 ©   (2005-01-04 12:26) [9]

select a.notnullfield, b.notnullfield
 from a cross join b
 where (a.field1 = b.field1 or a.field1 is null and b.field1 is null)
   and (a.field2 = b.field2 or a.field2 is null and b.field2 is null)
   and ...
  group by a.notnullfield, b.notnullfield
  having a.notnullfield is null or b.notnullfield is null

Вернутся отличающиеся записи. Надеюсь, cross join поддерживается.


 
msguns ©   (2005-01-04 12:27) [10]

Определись сначала ЧТО хочешь получить:
- если просто информацию об идентичности таблиц без подробностей, то никаких UNION`ов не надо. Два селекта и один суспенд. Ах да, еще два вых.параметра
- если с подробностями, в смысле выдать ID оригинальных записей, то надо определиться со структурой рез.НД. Например:
 TbNum   - номер таблицы (или имя)
 TbID    - ID оригинальной записи

Определись для начала


 
yaric   (2005-01-04 12:33) [11]

Хочу получить просто информацию.
Я таким способом проверяю были ли использованы настройки по умолчанию или выставлены специфические


 
msguns ©   (2005-01-04 12:35) [12]

Если это разовая операция, то зачем ХП. Просто напиши 2 запроса и выполни их скриптом.


 
yaric   (2005-01-04 12:41) [13]

Просто это делается много раз
Вообщем таким образом определяется "Пакет документации" был сформирован на основании настроек по умолчанию или нет. Соответственно эта характеристика "Пакета" присутствует в общемм реестре пакетов. Поэтому мне надо выполнить эту проверку для каждого пакета.


 
yaric   (2005-01-04 12:52) [14]

cross join поддерживается SQL 92 и не поддерживается Interbase 6.0|Firebird 1.x


 
msguns ©   (2005-01-04 12:52) [15]

Наводящий вопрос: зачем держать в одной базе две таблицы с одинаковой инфой ? Если же эта одна и та же таблица, но в двух разных версиях БД (находящихся, к примеру, в двух разных ЛВС или несвязанных сетью компах), то, вероятно, стОит вести речь о репликации. Или я чего-то не понял ?


 
Vemer ©   (2005-01-04 12:53) [16]

Вариант...

Select Документ_ID, Документ_Имя, ....
From Документы
Where Документы.Настройка1 <> Настройки_По_Умолчанию .Настройка1 ...
Or Документы.НастройкаN <> Настройки_По_Умолчанию .НастройкаN</CODE


 
msguns ©   (2005-01-04 13:09) [17]

>Vemer ©   (04.01.05 12:53) [16]

Страшный запрос ;))


 
yaric   (2005-01-04 13:11) [18]

>>msguns ты не понял
дело идет о 3 таблицах в БД
пакеты, настройки пакетов, настройки по умолчанию.
Необходимо узнать данный пакет использовал настройки по умолчанию или нет и вывести эту информацию отдельным полем в реестре пакетов


 
yaric   (2005-01-04 13:13) [19]

Вариант [9] подходит
только как написать этот запрос
select a.notnullfield, b.notnullfield
from a cross join b
where (a.field1 = b.field1 or a.field1 is null and b.field1 is null)
  and (a.field2 = b.field2 or a.field2 is null and b.field2 is null)
  and ...
 group by a.notnullfield, b.notnullfield
 having a.notnullfield is null or b.notnullfield is null
под Firebird поскольку он Cross Join не поддерживает


 
Sandman25 ©   (2005-01-04 14:19) [20]

select a.id, cast (null as integer)
from a
where not exists (select 1 from b where
 (a.field1 = b.field1 or a.field1 is null and b.field1 is null)
 and (a.field2 = b.field2 or a.field2 is null and b.field2 is null)
 and ...
)
union all
select cast (null as integer), b.id
from b
where not exists (select 1 from a where
 (a.field1 = b.field1 or a.field1 is null and b.field1 is null)
 and (a.field2 = b.field2 or a.field2 is null and b.field2 is null)
 and ...
)
О примерно таком запросе писал msguns, если не ошибаюсь


 
yaric   (2005-01-04 14:25) [21]

спасибо



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

Форум: "Базы";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
14-1105964746
kai
2005-01-17 15:25
2005.02.06
печать в postscript


1-1106525159
Profi
2005-01-24 03:05
2005.02.06
Свой TTreeView


3-1105100023
Lucifer
2005-01-07 15:13
2005.02.06
Создание програмно псевданима DB MSAccess


1-1106653058
JohnS
2005-01-25 14:37
2005.02.06
Как начать работать с XML в D7 ?


4-1103382597
Laxy
2004-12-18 18:09
2005.02.06
Список оборудования





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский