Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Допоможіть порівняти таблиці SQL

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Є 2 таблиці

account: id, acc, ccy, amount

flex: id, acc, ccy, amount

Потрібно їх порівняти і показати різницю. Порівнювати можна тільки по acc, ccy, amount.

ID треба також показати, тому minus не підійде.

Full join також не підходить так як наприклад в першій таблиці:

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE

1 37466538769 UAH D 45 UY

В другій таблиці:

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE

4 37466538769 UAH D 45 UY

2 37466538769 UAH D 45 UY — цей запис не буде показано як різниця

3 37466538769 UAH D 45 UY — цей запис не буде показано як різниця

Різниця має виглядати наприклад, так:

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE

2 37466538769 UAH D 45 UY

3 37466538769 UAH D 45 UY

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Був знайдений альтернативний вихід:
групування по ACC AE_CCY, DRCR_IND, AMOUNT, MODULE, а ID — wm_concat

Збереження всіх ID і подальго аналізу проблем.

не зовсім чітко задача поставлена, якщо в прикладі всі значення однакові (крім ІД),
то це не «різниця», це щось типу:
«треба знайти всі записи, де acc, ccy (чи AE_CCY?), amoun різні, а також перше з попавшихся, де хоч щось не таке, решту, з однаковими acc, ccy, amoun не показувати»
таке завдання?

і в прикладі різниці в acc, ccy (чи AE_CCY?), amount в цих даних нема (чи я не так дивлюсь?)

junior_dev

Я предположу что для ТС подойдёт любой из ответов, главное чтобы были разные ID реально соответствующие остальным данным и в нужном количестве. Если же у ТС есть дополнительная идентифицирующая информация, позволяющая сопоставить записи из двух таблиц 1 к 1, то её и нужно использовать для поиска разницы. Однако судя по формулировке задачи, такой инофрмации у ТС нету, следовательно и логичных правил выбора лучшем, чем «первый попавшийся подходящий» — тоже

найти разницу не проблема, проблема вывести «правильные» ID потому что не понятно что есть правильные ID

2Автор, какой правильный ответ для вашего примера?
ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
2 37466538769 UAH D 45 UY
3 37466538769 UAH D 45 UY

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
2 37466538769 UAH D 45 UY
4 37466538769 UAH D 45 UY

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
3 37466538769 UAH D 45 UY
4 37466538769 UAH D 45 UY

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
3 37466538769 UAH D 45 UY
2 37466538769 UAH D 45 UY

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
4 37466538769 UAH D 45 UY
2 37466538769 UAH D 45 UY

ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
4 37466538769 UAH D 45 UY

3 37466538769 UAH D 45 UY

Задание на мой взгляд сложное и, по-моему, одним запросом не решается в принципе. Однако особенно непонятно место про

Но надо сохранить ID в отображении

Вот в примере в самом перевом посте, как решить какая из 3 одинаковых записей (отличающихся лишь ID) — «лишняя» и, соответственно, какие другие два ID нужно показать?
Мне кажется что вначале нужно сделать MINUS, а потом как-то хитроумном JOIN’ить чтобы получить нужные ID’шники в нужном количестве.
2 предыдщий Аноним

Этот простой план не соответствует условию, а именно тому, что в A и B ID могут отличаться для «одной и той же» записи с точки зрения логики требуемой автору (см. оригинальны пример).

Т.е.,


(select a.id as a_id, [данные A],-1 as b_id from A where a.id not in (select a.id from A inner join B on (A.id = B.a_id)))
union
(select -1, [данные B], b.id as b_id from B where b.id not in (select b.id from B inner join A on (A.id = B.a_id))

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

Т.е., Вам необходимо показать те записи, которые не входят в общее подмножество?
не пересекаются?
Наверно, слишком сложно будет...
Но как мне кажется... Первое, что пришло в голову.

Взять иннер джойном общее множество, а потом двумя юнионами то, что в этом ножество не входит (NOT IN) из обеих таблиц

Right Join, Left join, Full join — записи з"єяднується не по принципу один до одного, а один до багатьох

Уникальный ключ только ID
Главное показать платежи на суммы, которых нет в другой базе. Или количество совпадений в одной базе не отвечает совпадениям в другой (как в примере).

Но надо сохранить ID в отображении

Мне кажется не хватает детализации ограничений. Является ли одна таблица над-множеством другой? Или у нас в обоих могут быть записи которых нету в другой (например ACC равны, а Amount разные) и как разницу нужно показать все такие записи из обоих таблиц? Судя по примеру ни ACC, ни тройка (acc, ccy, amount) не являются уникальным ключом, так?

Якщо взяти not exists in, тоді різниця буде не:
ID ACC AE_CCY, DRCR_IND, AMOUNT, MODULE
2 37466538769 UAH D 45 UY
3 37466538769 UAH D 45 UY

А пусті строки так як порінювати можна тільки по ACC AE_CCY, DRCR_IND, AMOUNT, MODULE, а вони одинакові.

Підписатись на коментарі