SQL Full Outer Join без дубликатов с одинаковым условием - PullRequest
0 голосов
/ 12 октября 2019

Ниже приведены две таблицы.

Я хочу найти и объединить записи между двумя таблицами, имеющими значение -1 или +1. Но в этом случае он также возвращает мне дубликаты записей. Как я могу получить результат без дубликатов записей?

enter image description here

drop table if exists #A

CREATE TABLE #A(ID float, Category varchar(10), Amount float )
insert into #A values

(1,'A',150.4),
(2,'A',151.0),
(3,'A',149.8),
(4,'A',165.0),
(5,'A',165.0)

drop table if exists #B

CREATE TABLE #B(BID float, BCategory varchar(10), BAmount float )
insert into #B values

(95,'A',151),
(101,'A',150),
(115,'A',165.0),
(118,'A',165.0)

Я пробовал следующий запрос, который возвращает дубликаты.

select * 
from
    (select 
         ID, category, Amount, 
         row_number() over (partition by category, Amount order by category, Amount) as Sr 
     from #A) A
full outer join
    (select 
         BID, Bcategory, BAmount, 
         row_number() over (partition by Bcategory, BAmount order by Bcategory, BAmount) as Sr 
     from #B) B on a.category = b.bCategory 
                and a.amount between b.bamount - 1 and b.BAmount + 1 
                and a.sr = b.sr

Логика: как текущий пользовательСопоставление вручную: -

Сначала попробуйте Точное совпадение (категория и сумма) с другой таблицей. Затем все, что осталось, попытается сопоставить Категорию и Сумму с (+/- 1) Таблицы B.

Таким образом, 149,8 или 150,4 от A, оба могут присоединиться к 150 из B. Поскольку только один (150) в Таблице Bосталось, а 151 уже назначено 151 при точном совпадении, одна запись A будет объединена с нулем.

Скажем, так как 150.4 появляется первым в таблице A, оно может идти с 150 в TableB.

и 149,8 останутся непревзойденными. Практически пользователь не против того, чтобы совпадать ни с, ни с. Важно то, что любая строка (150,4 или 149,8) должна соответствовать нулю. Проблема с левым или полным внешним соединением заключается в том, что 150 из B назначается обоим (149,8 и 150,4).

1 Ответ

1 голос
/ 12 октября 2019

Если вам нужна уникальная запись, нам нужно сопоставить связь между таблицей

Определение таблицы

drop table if exists #A

CREATE TABLE #A(ID float, Category varchar(10), Amount float )
insert into #A values

(1,'A',150.4),
(2,'A',151.0),
(3,'A',149.8),
(4,'A',165.0),
(5,'A',165.0)

drop table if exists #B

CREATE TABLE #B(AID float,BID float, BCategory varchar(10), BAmount float )
insert into #B values

(2,95,'A',151),
(1,101,'A',150),
(4,115,'A',165.0),
(5,118,'A',165.0)

Запрос

SELECT * FROM #A A
LEFT JOIN #B B ON  A.ID = B.AID

Другой способ

select * 
from
    (select 
         ID, category, Amount, 
         row_number() over (partition by category, Amount order by category, Amount) as Sr 
     from #A) A
full outer join
    (select 
         AID,BID, Bcategory, BAmount, 
         row_number() over (partition by Bcategory, BAmount order by Bcategory, BAmount) as Sr 
     from #B) B on a.category = b.bCategory 
                and a.amount between b.bamount - 1 and b.BAmount + 1 
                and a.sr = b.sr AND A.ID = B.AID

Результат вывода

Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...