Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как проверить что две таблицы одинаковы [FB 1.5]


Страницы:   1 2

yaric ©   (2005-01-04 11:54:00) 

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


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

спасибо


Sandman25   (2005-01-04 14:19:00) [2]

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 13:13:00) [3]

Вариант [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 не поддерживает


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

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


msguns   (2005-01-04 13:09:00) [5]

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

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


Vemer   (2005-01-04 12:53:00) [6]

Вариант...

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


msguns   (2005-01-04 12:52:00) [7]

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


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

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


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

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


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

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


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

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


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

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

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


Sandman25   (2005-01-04 12:26:00) [13]

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 поддерживается.


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

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


msguns   (2005-01-04 12:14:00) [15]

UNION


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

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

Это как?


msguns   (2005-01-04 12:05:00) [17]

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

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


yaric   (2005-01-04 12:04:00) [18]

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


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

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


msguns   (2005-01-04 11:58:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо