Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Проверка целостности


Автор: tishaishii 18.2.2012, 18:02
Есть таблицы T1(ID, DOCTYPE, DOCID, DOCITEM) и T2(ID, ID_T1, DOCTYPE, DOCID, DOCITEM).
T1.ID <=>> T2.ID_T1
То есть, в T2 ведётся история T1.
Нужно составить запрос, который бы возвращал список T1.ID, в которых {T1.DOCTYPE, T1.DOCID,  T1.DOCITEM} не соответствуют последним записям в T2.

Автор: Akina 18.2.2012, 20:00
Цитата(tishaishii @  18.2.2012,  19:02 Найти цитируемый пост)
последним записям в T2.

В таблице остутствует штамп времени, соответственно неясно, что означает "последние"...

Автор: nellyk 20.2.2012, 00:02
Цитата(tishaishii @ 18.2.2012,  18:02)
Есть таблицы T1(ID, DOCTYPE, DOCID, DOCITEM) и T2(ID, ID_T1, DOCTYPE, DOCID, DOCITEM).
T1.ID <=>> T2.ID_T1
То есть, в T2 ведётся история T1.
Нужно составить запрос, который бы возвращал список T1.ID, в которых {T1.DOCTYPE, T1.DOCID,  T1.DOCITEM} не соответствуют последним записям в T2.

SELECT T1.ID FROM T1,T2 WHERE T1.ID NOT IN (SELECT DISTINCT ID_T1 FROM T2) 
UNION
SELECT T1.ID FROM T1, T2, (SELECT ID_T1, MAx(ID) AS ID_T2 FROM T2 GROUP BY ID_T1) T3 WHERE T1.ID=T3.ID_T1 AND T2.ID=T3.ID_T2 AND (T1.DOCTYPE <> T2.DOCTYPE OR T1.DOCID <> T2.DOCID OR T1.DOCITEM <> T2.DOCITEM) 

Сверху идентификаторы, отсутствующие в истории, снизу - те, у которых есть различия с последними "историческими" записями.

Автор: tishaishii 23.2.2012, 10:33
"Последнее" - это последняя запись.
Время - неоднозначный критерий.

Автор: Akina 23.2.2012, 20:06
Цитата(tishaishii @  23.2.2012,  11:33 Найти цитируемый пост)
"Последнее" - это последняя запись.

Последняя при какой сортировке? потому как без сортировки такого понятия как "первая-последняя-прочее" не существует.
Цитата(tishaishii @  23.2.2012,  11:33 Найти цитируемый пост)
Время - неоднозначный критерий. 

Только если поле не уникально.

Автор: tishaishii 26.2.2012, 17:48
Обычно, по-умолчанию, упорядочивание выполняется по первичному ключу. PK, предполагаю как T1.ID и T2.ID, FK предполагаю как T2.ID_T1.

Автор: Zloxa 27.2.2012, 10:40
Цитата(tishaishii @  26.2.2012,  17:48 Найти цитируемый пост)
Обычно

smile

Цитата(tishaishii @  18.2.2012,  18:02 Найти цитируемый пост)
Нужно составить запрос, который бы возвращал список T1.ID, в которых {T1.DOCTYPE, T1.DOCID,  T1.DOCITEM} не соответствуют последним записям в T2.

Цитата(tishaishii @  26.2.2012,  17:48 Найти цитируемый пост)
 по первичному ключу


Код

select T1.ID
  from T1
  where not exists (select null from t2 
                     where T2.ID_T1 = T1.ID
                       and T1.DOCTYPE = t2.doctype 
                       and T1.DOCID = t2.docid 
                       and T1.DOCITEM = t2.DOCITEM
                       and not exists (select null 
                                         from t2 t2_ 
                                         where t2_.ID_T1 = t2.ID_T1
                                           and t2.ID > t2_.ID
                                       )
                       )

Это решение в лоб.
Задача сводится к нахождению последней записи в логе и сравнению с исходной таблицей.
Подзадача "выбрать последнюю запись" имеет несколько вариантов http://www.sql.ru/forum/actualthread.aspx?tid=687908
Пожалуй, самый эффективный тут будет "http://forum.vingrad.ru/act-Search/CODE/show/searchid-b7e40eace5bc8feb98b48d411c24ca3f/search_in-posts/result_type/posts/flag/search/highlite/%25D0%25B1%25D0%25B0%25D0%25B1%25D1%2583%25D1%2588%25D0%25BA%25D0%25B8%25D0%25BD+%25D0%25BC%25D0%25B5%25D1%2582%25D0%25BE%25D0%25B4/index.html"

Автор: tishaishii 29.2.2012, 06:39
Ссылка на "бабушкин метод" пуста.smile
Вобщем-то я задачу решил, может быть не самым эффективным способом, и закрыл возможность появления "нехороших" записей.

Автор: Zloxa 29.2.2012, 08:38
Цитата(tishaishii @  29.2.2012,  06:39 Найти цитируемый пост)
Ссылка на "бабушкин метод" пуста

Можете и сами выполнить поиск на форуме http://forum.vingrad.ru/act-Search/CODE/show/searchid-4b3a7a81b96f13d704d19b0766635810/search_in-posts/result_type/posts/flag/search/highlite/%25D0%25B1%25D0%25B0%25D0%25B1%25D1%2583%25D1%2588%25D0%25BA%25D0%25B8%25D0%25BD+%25D0%25BC%25D0%25B5%25D1%2582%25D0%25BE%25D0%25B4/index.html.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)