выбрать уникальные поля при объединении - PullRequest
0 голосов
/ 17 января 2019
CREATE TABLE Face.Person 
   ("LAST_NAME" VARCHAR2(50 BYTE), 
    "TICKET_NUMBER" VARCHAR2(50 BYTE));

insert into Person(last_name,ticket_number) values('johnson','100');
insert into Person(last_name,ticket_number) values('smith','200');

CREATE TABLE Face.Orders 
   ("REGION" VARCHAR2(50 BYTE), 
    "STATE" VARCHAR2(50 BYTE), 
    "A_CODE" VARCHAR2(5 BYTE),
    "STORE_NUM" VARCHAR2(50 BYTE), 
    "TICKET_NUMBER" VARCHAR2(50 BYTE),
    "SEQ" NUMBER(12));

insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ ) values('100', 'S', 'F1', '111', 'Mia', 1);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ ) values('100', 'S', 'F1', '222', 'FLL', 2);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ ) values('100', 'S', 'F1', '333', 'PBI', 3);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ ) values('100', 'S', 'F1', '444', 'BOC', 4);


SELECT A.LAST_NAME, A.TICKET_NUMBER, B.REGION, B.STATE 
FROM PERSON A
  JOIN Orders B ON A.TICKET_NUMBER 
    = (SELECT * FROM Orders WHERE A.TICKET_NUMBER= B.TICKET_NUMBER 
  AND ROWNUM = 1);

Присоединиться к обеим таблицам по номеру билета. Человек - это один ко многим отношениям с Орденами. Существует несколько заказов, но нужна только одна запись заказов (из 4), которая соответствует номеру заявки из обеих таблиц. Причина в том, что поля, требуемые из таблицы заявок, остаются одинаковыми для всех записей с одинаковым номером заявки.

Ожидаемый результат:

Johnson 100 S Fl 

Джонсон и 100 из person таблицы и S и FL, которые остаются одинаковыми для всех записей на уникальный номер заявки, из Orders таблицы

Oracle 12c

1 Ответ

0 голосов
/ 17 января 2019

Не ясно, на каком основании вы выбираете записи из Orders. Один из вариантов - просто выбрать MIN() из region & state с группой, а затем присоединиться к ней с Person

WITH b AS (
     SELECT ticket_number,
            MIN(region) AS region,
            MIN(state) AS state
     FROM orders
     GROUP BY ticket_number
) SELECT a.last_name,
         a.ticket_number,
         b.region,
         b.state
  FROM person a
  JOIN b ON a.ticket_number = b.ticket_number;

Демо

...