【问题标题】:select unique fields on join在加入时选择唯一字段
【发布时间】:2019-06-11 04:54:46
【问题描述】:
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);

在票号上加入两个表。 Person 与 Orders 是一对多的关系。存在多个订单,但只需要一个与两个表中的票号匹配的订单记录(共 4 条)。原因是订单表中所需的字段对于具有相同票号的所有记录保持相同。

预期结果:

Johnson 100 S Fl 

person 表中的 Johnson 和 100 以及每个唯一票号的所有记录都保持相同的 S 和 FL 来自 Orders

甲骨文 12c

【问题讨论】:

    标签: sql oracle join unique


    【解决方案1】:

    不清楚您从Orders 中选择记录的依据是什么。一种选择是简单地选择MIN()regionstate 与一组by 然后加入它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;
    

    Demo

    【讨论】:

    • 谢谢 - 更新它以使用选择并在子选择中添加另一列,并在子选择和外部选择中检查字段是否为空。
    • SELECT a.last_name, a.ticket_number, b.region, b.state, b.SEQ1 FROM person a JOIN (SELECT ticket_number, MIN(SEQ) AS SEQ1, MIN(region) AS region, MIN(state) AS state FROM orders WHERE REGION IS NOT NULL GROUP BY ticket_number ) b ON a.ticket_number = b.ticket_number where a.last_name is not null;
    • @javacoder :不客气。如果它对您有用,请考虑接受答案,以便它也可以帮助其他人
    猜你喜欢
    • 2018-09-16
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多