powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбрать значения из одной таблицы которых нет в другой.
8 сообщений из 8, страница 1 из 1
Выбрать значения из одной таблицы которых нет в другой.
    #39598924
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаю что тема давно заезжена, но у меня не получается. Понимаю что надо это делать джойнами, но опять таки не получается.
Имеем:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE TMP_CHECK_REESTR (
    BD        INTEGER NOT NULL,
    ZV_DATA   DATE NOT NULL,
    CODE_ORG  INTEGER NOT NULL,
    TYP       SMALLINT NOT NULL,
    POSL      SMALLINT NOT NULL,
    NUMB      INTEGER NOT NULL,
    R_SM      DECIMAL(9,2),
    R_FK      DECIMAL(9,2),
    R_FN      DECIMAL(9,2)
);

CREATE INDEX IDX_TMP_CHECK_REESTR ON TMP_CHECK_REESTR (BD, ZV_DATA, CODE_ORG, TYP, POSL, NUMB);



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE CHECK_REESTR (
    BD          INTEGER NOT NULL,
    ZV_DATA     DATE NOT NULL,
    CODE_ORG    INTEGER NOT NULL,
    TYP         SMALLINT NOT NULL,
    POSL        SMALLINT NOT NULL,
    NUMB        INTEGER NOT NULL,
    PR_SM       DECIMAL(9,2),
    R_SM        DECIMAL(9,2),
    R_FK        DECIMAL(9,2),
    R_FN        DECIMAL(9,2),
    RES_CHECK1  SMALLINT
);

ALTER TABLE CHECK_REESTR ADD CONSTRAINT PK_CHECK_REESTR PRIMARY KEY (BD, ZV_DATA, CODE_ORG, TYP, POSL, NUMB);




1. Из отчетов формируются реестры в Excel. В реестр, из отчетов, может попасть несколько строк у которых одинаковые значения BD, ZV_DATA, CODE_ORG, TYP, POSL, NUMB но разная сумма в PR_SM. Это нормально т.к. финансирование может быть за несколько месяцев в одном.
2. Поставщик заполняет свои значения и возвращает реестр на подпись.
3. Необходимо сверить реестр который формировался с тем который вернул поставщик.
В теории, если поставщик не химичит поле R_SM должно быть точно такое же как PR_SM, поле R_FK - фактическое начисление , R_FN - сумма к финансированию которая не должна быть больше PR_SM но может быть меньше.

Важно чтобы:
1. Общая сумма по реестру не поменялась
2. Не должна поменятся общая сумма по коду товара NUMB.

Решил это сделать формированием таблицы для сверки CHECK_REESTR. В которую загружаю данные из отчетов с суммированием по полю sum(PR_SM) group by BD, ZV_DATA, CODE_ORG, TYP, POSL, NUMB. Поля R_SM, R_FK, R_FN оставляю пустыми (null).

Далее в таблицу TMP_CHECK_REESTR импортирую данные из реестра Excel.
Потом по совпадению полей BD, ZV_DATA, CODE_ORG, TYP, POSL, NUMB в двух таблицах обновляю поля R_SM, R_FK, R_FN общими суммами:
для этого выполняю 2 запроса:

открываю запрос для нахождения сумм:
Код: sql
1.
2.
3.
SELECT TMP.BD, TMP.ZV_DATA, TMP.CODE_ORG, TMP.TYP, TMP.POSL, TMP.NUMB, sum(TMP.R_SM), sum(TMP.R_FK), sum(TMP.R_FN)
FROM TMP_CHECK_REESTR TMP
group by TMP.BD,TMP.ZV_DATA,TMP.CODE_ORG,TMP.TYP,TMP.POSL,TMP.NUMB


потом в цикле делаю изменение:
Код: sql
1.
2.
3.
update CHECK_REESTR
set R_SM = :R_SM, R_FK = :R_FK, R_FN = :R_FN
where BD = :BD and ZV_DATA = :ZV_DATA and CODE_ORG = :CODE_ORG and TYP = :TYP and POSL = :POSL and NUMB = :NUMB



Возможно это все можно сделать и одним запросом - подскажите как, буду очень благодарен.

Тут пока вопросов нет. Все записи которые есть обновятся.
Но если поставщик нахимичил, то:
1. Если он удалил товар - поля R_SM, R_FK, R_FN останутся пустыми. Это я быстро отловлю.
2. Если поставщик добавил товар. как мне отловить что есть в TMP_CHECK_REESTR, но нет в CHECK_REESTR

Делаю так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select tc.BD, tc.ZV_DATA, tc.CODE_ORG, tc.TYP, tc.POSL, tc.NUMB, tc.R_SM, tc.R_FK, tc.R_FN
from TMP_CHECK_REESTR tc
   left outer join CHECK_REESTR cr on ( tc.bd = cr.bd
                        and tc.numb = cr.NUMB
                        and tc.ZV_DATA = cr.ZV_DATA
                        and tc.TYP = cr.TYP
                        and tc.POSL = cr.POSL
                        and tc.CODE_ORG = cr.CODE_ORG)


не получается. Пробовал и Right и full - не получается. Но я знаю точно что запись есть так как сам ее туда добавил (чтобы протестировать).

Подскажите что я неправильно делаю.
--------------------------
Firebird 3.0.2.32703;
IBExpert 2018.1.6.1;
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию

Среда разработки:
Delphi XE2 + FIBPlus 7.4
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39598948
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrushВыбрать значения из одной таблицы которых нет в другой.

Есть две таблички, A и B.

A:
id int
nm varchar (10)

B:

id int
nm varchar (10)


Выбираем записи из A, у которых значение поля nm не встречаются в B:
Код: sql
1.
2.
3.
select A.* from A
where not exists(select * from B
                 where A.nm = B.nm)   



PS: бред про " реестры в Excel" <и дальше> не читал.
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39598952
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

или
select ...
from A jeft join b on A.nm = B.nm
where b.nm is null

выбираем все записи из A, для которых нет соответствия в B.
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39598961
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

а возможно, что "правильнее" будет так:

Код: sql
1.
2.
3.
select A.* from A
where not exists(select * from B
                 where A.nm is not distinct from B.nm)   
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39598966
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
Это я все понимаю.
А как быть если проверка идет по 5 полям. В вашем примере 1 поле - это легко. А 5 мне кажется "не взлетит"
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39598972
akrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
с проверкой на нулл (where b.nm is null)
получилось. Спасибо.
Сейчас буду крутить на реальном массиве данных
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39599318
Dmitry Kurbsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akrushkdv,
Это я все понимаю.
А как быть если проверка идет по 5 полям. В вашем примере 1 поле - это легко. А 5 мне кажется "не взлетит"

AND
...
Рейтинг: 0 / 0
Выбрать значения из одной таблицы которых нет в другой.
    #39599331
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДа возможно, что "правильнее" будет так:Чем именно правильнее?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбрать значения из одной таблицы которых нет в другой.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]