Выберите отдельные записи из двух разных таблиц - PullRequest
0 голосов
/ 17 октября 2018

У меня есть две базы данных:

Account Number:    Days Opened:
1                  3
2                  10
3                  30
4                  17

Account Number:    Company:   Transaction Date:
1                  ABC        1-1-1990
1                  ABC        2-1-1990
1                  ABC        3-1-1990
2                  DEF        10-2-1991
2                  DEF        11-2-1992
3                  GHI        20-3-1993

Как мне заставить его вернуть следующее (только при просмотре счетов, открытых менее чем за двадцать дней):

Account Number:    Days Opened:   Company:
1                  3              ABC
2                  10             DEF
4                  17             ?

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

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Создайте таблицу, подобную вашей.

CREATE TABLE table1
    ([AccountId] Int, [DaysOpened] Int)
;

INSERT INTO table1
    ([AccountId], [DaysOpened])
VALUES
    (1, 3),
    (2,10),
    (3,30),
    (4,17);

CREATE TABLE table2
    ([AccountId] Int, [Company] varchar(50),[TransactionDate] date)
;

INSERT INTO table2
    ([AccountId], [Company],[TransactionDate])
VALUES
    (1, 'ABC','1-1-1990'),
    (1, 'ABC','2-1-1990'),
    (1, 'ABC','3-2-1990'),
    (2, 'DEF','10-2-1990'),
    (3, 'GHI','20-3-1990'); 

И попробуйте этот скрипт.

select t1.AccountId,t1.DaysOpened,t2.Company from table1 t1
left join table2 t2 ON t1.AccountId=t2.AccountId
where DaysOpened < 20
Group by t1.AccountId,t1.DaysOpened,t2.Company

Вы можете попробовать по этой ссылке

0 голосов
/ 17 октября 2018

Ваша структура данных испорчена.Компания не должна быть в таблице транзакций.Вы должны искать это - предположительно в первой таблице.

Один метод в Teradata использует qualify:

select t1.accountno, t1.daysopened, t2.company
from table1 t1 join
     table2 t2
     on t1.acountno = t2.accountno
where t1.daysopened < 20
qualify row_number() over (partition by t2.accountno order by t2.transaction_date desc) = 1;
0 голосов
/ 17 октября 2018

Вы можете использовать группу по, чтобы вы возвращали только уникальные комбинации:

sel a.account_number
, a.days_opened
, c.company
from accounts a
inner join companies c
on a.account_number = c.account_number
where a.days_opened < 20
group by 1,2,3

Вы также можете использовать левое соединение, если вы хотите иметь пустые строки для номеров счетов, которых нет в таблице компании.,Однако, учитывая ваш потенциальный результат, я думаю, что вам нужно внутреннее соединение.

0 голосов
/ 17 октября 2018

Попробуйте ниже, используя внутреннее соединение и различные

select distinct t1.accountno,t1.daysopened,t2.Company from table1 t1 left join table2 t2
on t1.accountno=t2.accountno
and DaysOpened<20
...