Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Приветствую форумчан! Подскажите, есть таблица tblWorkFlow , где есть поля - PersonID(int) , BookID(int) , Dateofrent(datetime) , Info(nvarchar(50)) . Постоянно возникает надобность удалить все записи конкретного PersonID и вставить новые. Но перед тем как удалить, я хотел бы предварительно сохранить слепок удаляемых записей, чтобы впоследствии сравнить со вновь вставляемыми. Поэтому, задумал план такой: завожу транзитную таблицу tblHistory , и потом a) снимаем копию с рабочей таблицы текущих данных: Код: sql 1. b) вставляем свежие данные в tblWorkFlow Код: sql 1. И теперь вот вопрос , каким образом получить событие, что есть изменённые данные(изменённые, удалённые, вновь добавленные BookID)? (В том случае, если они действительно есть). Т.е. я пытаюсь придумать некий триггер, что после того, как на сервере произошло удаление и вставка данных, проводилось бы сравнение двух выборок данных, как если бы сравнивали два рекордсета: Код: sql 1. 2. 3. и только если есть отличия, отбирались бы затронутые BookID. П.С. Если перевести на человеческий язык, то в БД есть Пользователи, которые берут книги в библиотеке. Например, изначально, Пользователь Иван взял 5 книг. Затем, 2 вернул, и взял ещё какую-то. Библиотекарь, удаляет всю информацию в БД касаемо этого пользователя и вносит новые сведения. Задача получить ID книг, с которыми произошли манипуляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 22:54 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600, Ваш синтаксис нерабочий. Также инструкция delete имеет ключевое слово output ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 00:30 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Ну и в таблице приемнике нужно просто сделать поле со временем вставки. Это самое простое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 00:33 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Я, канешно, понимаю, что библиотекари и бухгалтеры - это разные люди. Но ценный опыт перенимать надо. 1. Никаких историй. 2. Одна таблица. 3. В нее вносим выдачу. ДАТА. 4. В нее же вносим возврат. ОТДЕЛЬНОЙ СТРОКОЙ. ДАТА. 5. Профит. 6. Вся история в одном флаконе. И на любую дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 08:13 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600 Например, изначально, Пользователь Иван взял 5 книг. Затем, 2 вернул, и взял ещё какую-то. Библиотекарь, удаляет всю информацию в БД касаемо этого пользователя и вносит новые сведения. Нужно в базу записывать факты. Не надо "удалять", "вносить", нужно делать так же, как без компьютера. Вот в библиотеке раньше, до компьютеров, была карточка читателя. Когда читатель приходил, карточку не сжигали, заводя новую. Туда просто писали факт: Взял книгу "ааа". Вернул книгу "ббб". На каждую книгу одна запись. И в базе делайте так же. Это будет основная таблица (наряду с справочником книг и справочником читателей), по ней можно получить всю информацию. Об этом уже написал aleks222, я просто немного подробнее пытаюсь объяснить :-) Кроме того, когда наберётесь опыта, можете сделать агрегированные данные - количество выданных книг в таблице книг, и таблицу со списоком текущих выданных книг (простая связь PersonID, BookID). Это позволит быстрее получать данные. Но сразу лучше этим не заниматься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 10:24 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Так, спасибо, немного внесём ясности, а) никакой исторической информации в таблице не должно быть, т.к. это текущие актуальные данные, с которыми работают другие сервисы б) опираться исключительно на поле дата не эффективно, т.к. вставляться могут те же самые данные, что были удалены Рассмотрим задачу схематично: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. условно говоря, что мы здесь видим: записи @tblWorkFlow.BookID IN (1,2) - не изменились (они удалились, но затем были вновь добавлены, правда уже с новым id 6 и 7) запись @tblWorkFlow.BookID = 3 - изменено поле Info (запись удалена, затем была вставлена новая, под новым id = 8) записи @tblWorkFlow.BookID IN (4,5) - удалены запись @tblWorkFlow.BookID = 6 - вновь добавленная И вот как вычислить именно @tblWorkFlow.BookID IN (3,4,5,6) - что они новые или по ним были изменения в полях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 10:39 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Так, спасибо, немного внесём ясности, а) никакой исторической информации в таблице не должно быть, т.к. это текущие актуальные данные, с которыми работают другие сервисы б) опираться исключительно на поле дата не эффективно, т.к. вставляться могут те же самые данные, что были удалены Рассмотрим задачу схематично: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. условно говоря, что мы здесь видим: записи @tblWorkFlow.BookID IN (1,2) - не изменились (они удалились, но затем были вновь добавлены, правда уже с новым id 6 и 7) запись @tblWorkFlow.BookID = 3 - изменено поле Info (запись удалена, затем была вставлена новая, под новым id = 8) записи @tblWorkFlow.BookID IN (4,5) - удалены запись @tblWorkFlow.BookID = 6 - вновь добавленная И вот как вычислить именно @tblWorkFlow.BookID IN (3,4,5,6) - что они новые или по ним были изменения в полях? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 10:56 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Deff Код: sql 1. 2. 3. ISNULL здесь лишний ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:03 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Deff, здесь у вас запрос возвращает только BookID = 3. а то что добавляется новая книга BookID = 6? а то что были удалены прежние 2 книги BookID = 4 и 5? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:04 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Deff, здесь у вас запрос возвращает только BookID = 3. а то что добавляется новая книга BookID = 6? а то что были удалены прежние 2 книги BookID = 4 и 5?Ну тогда уберите условие "and S.BookID = W.BookID", и будет только по пользователю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:05 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
iapDeff Код: sql 1. 2. 3. ISNULL здесь лишнийНет, не лишний. При отсутствии записи придет Null, и он не попадет в сравнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:09 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
DeffНу тогда уберите условие "and S.BookID = W.BookID", и будет только по пользователю по-моему, что-то здесь не так, вернулись такие записи: Код: plaintext 1. 2. 3. 4. 5. Нужен ответ такой: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:26 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600DeffНу тогда уберите условие "and S.BookID = W.BookID", и будет только по пользователю по-моему, что-то здесь не так, вернулись такие записи: Код: plaintext 1. 2. 3. 4. 5. Нужен ответ такой: Код: plaintext 1. 2. 3. 4. Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:45 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Вместо join лучше на exist переделать - планы могут быть получше, но вам возможно нужно больше полей, но тогда там надо доделать, чтобы distinct сработал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 11:48 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Или через full join Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:05 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Нужен ответ такой: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:10 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. за буквы доплачивают? допишитн ещё 1 = 1 OR 2 = 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:10 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
TaPaK Код: sql 1. за буквы доплачивают? допишитн ещё 1 = 1 OR 2 = 2У меня верный запрос. Как короче написать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:12 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
DeffTaPaK Код: sql 1. за буквы доплачивают? допишитн ещё 1 = 1 OR 2 = 2У меня верный запрос. Как короче написать? Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:30 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
TaPaKDeffпропущено... У меня верный запрос. Как короче написать? Код: sql 1. 2. Это мой первый запрос запрос , но он не правильный. Ключевой момент про книги. Можно взять одну, а сдать другую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 12:37 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Так, спасибо, немного внесём ясности, а) никакой исторической информации в таблице не должно быть, т.к. это текущие актуальные данные, с которыми работают другие сервисы б) опираться исключительно на поле дата не эффективно, т.к. вставляться могут те же самые данные, что были удалены Рассмотрим задачу схематично: Ээх, страдалец, лежит твой путь в управдомы. И чем быстрее ты переквалифицируешься - тем менее мучительно больно будет. ЗЫ. Не из актуальных данных делать историю надо. А из истории - актуальные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 13:57 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Ребят, спасибо за подсказки. Насколько я могу судить по результатам, варианты от Deff и alexeyvg меня успокоили. aleks222Ээх, страдалец, лежит твой путь в управдомы. И чем быстрее ты переквалифицируешься - тем менее мучительно больно будет. ЗЫ. Не из актуальных данных делать историю надо. А из истории - актуальные данные. Здесь ну что ответить, конечно, я новатор-экспериментатор в этих запросах, пытаюсь последовательно решать какие-то задачи. Но, с другой стороны, если представить что это не книги, а некие состояния каких-то регистров. Здесь, библиотеку и книги я привёл, ну чтоб не вдаваться в технические дебри устройства. Иначе говоря, мне вся история не особо нужна. Нужно только иметь возможность сравнения последнего состояния со вновь прибывшим. За критику спасибо, надо подумать, может быть есть смысл действительно хранить всю историю. Я и думал её хранить, она полезна для статистики. Но выбросил из головы идею, потому что не охота набивать таблицами бд. Хотя бы справиться с тем объёмом данных, которые циркулируют на самом верхнем слое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 15:06 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Но, с другой стороны, если представить что это не книги, а некие состояния каких-то регистров.То всё равно концепция странная. Вам нужно передать информацию об изменении состояния, но вы её формируете как "изменение состояния междду выполнениями запроса". Через некоторое время вы поймёте принципиальную ошибочность такого подхода, т.к. работа системы будет сопровождаться мелкими и трудноуловимыми багами. Мало ли, как там выполнился запрос, чем сервер был занят, как там проходили сетевые пакеты, и по тем или иным причинам запрос приходится повторить? А в новом запросе результат не будет возвращён, изменений то нет! И задумаетесь, "не сделать ли моменты времени получения справки об изменении состояния какими то овеществлёнными?" И получать информация об изменении состояния не "от запроса до запроса", а между вот этими моментами времени? Вот тогда придётся переходить на схему с записью фактов, и получением отчётов по этим фактам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 20:13 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
palladin600Приветствую форумчан! Подскажите, есть таблица tblWorkFlow , где есть поля - PersonID(int) , BookID(int) , Dateofrent(datetime) , Info(nvarchar(50)) . Постоянно возникает надобность удалить все записи конкретного PersonID и вставить новые. Но перед тем как удалить, я хотел бы предварительно сохранить слепок удаляемых записей, чтобы впоследствии сравнить со вновь вставляемыми. Начиная с 2016 - темпоральные таблицы бесплатны и доступны для всех редакций сервера. http://www.korshikov.guru/2015/06/sql-server-2016-temporal-tables/ https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017 Не благодарите. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2019, 08:29 |
|
||
|
Как, скажите, лучше проводить сравнение данных
|
|||
|---|---|---|---|
|
#18+
Критикpalladin600, Ваш синтаксис нерабочий. Также инструкция delete имеет ключевое слово output Также все это можно сделать конструкцией MERGE включая кстати возможность не удалять вставлять дубли, если их большинство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2019, 13:30 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39797578&tid=1687988]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
79ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 465ms |

| 0 / 0 |
