Форум: "Базы";
Текущий архив: 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.043 c