联接表 - 只有 return 第一个记录和不同的列(如果存在)否则 return 列为空
Join tables - only return first record and distinct column if exist else return null for column
加入两个 table 和 return 第二个 table 的第一个记录 - 有这个代码。第二个 table 中的一列可以具有相同的值。如果是,return 值;否则,return 为空。
使用了不同但仍然需要 return 第一条记录,即使列值不是不同的(即 return null)
CREATE TABLE Person ("LAST_NAME" VARCHAR2(50 BYTE),
"TICKET_NUMBER" VARCHAR2(50 BYTE));
BEGIN
insert into Person(last_name,ticket_number) values('johnson','100');
insert into Person(last_name,ticket_number) values('smith','200');
END;
/
CREATE TABLE 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));
SELECT a.last_name,
a.ticket_number,
b.region,
b.state,
b.SEQ1,
B.A_CODE
FROM person a
BEGIN
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '111', 'FLL', 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', 'FLL', 3);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'FLL', 4);
END;
/
JOIN (SELECT ticket_number, MIN(SEQ) AS SEQ1,
MIN(region) AS region,
MIN(state) AS state, MIN(A_CODE) AS A_CODE
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;
A_CODE 值相同 - return 值
LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 FLL
但是,如果 A_CODE 值不是唯一的(即不相同),则 A_CODE 列的 return 为空并且 return 第二个 table.
注意:作为一个选项,如果不相等,列值不需要 return null。它可以 return 像 'not equal'
这样的文字
LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 (NULL)
Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产
下面是查询,
SELECT a.last_name,
a.ticket_number,
b.region,
b.state,
b.SEQ1,
case when B.MIN_A_CODE = B.MAX_A_CODE then B.MIN_A_CODE else 'NULL' end A_CODE
FROM person a
JOIN ( SELECT ticket_number, MIN(SEQ) AS SEQ1,
MIN(region) AS region,
MIN(state) AS state, MIN(A_CODE) AS MIN_A_CODE, max(A_CODE) as MAX_A_CODE
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;
我在 table 个订单中又添加了一行。
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '111', 'FLL', 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', 'FLL', 3);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'FLL', 4);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'DLL', 4);
O/p -
LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 NULL
我的理解是因为对于同一区域你有不同的 A_CODE,你需要 A_CODE 为空,但所有其他列的值应该是第一条记录。
希望对您有所帮助
加入两个 table 和 return 第二个 table 的第一个记录 - 有这个代码。第二个 table 中的一列可以具有相同的值。如果是,return 值;否则,return 为空。
使用了不同但仍然需要 return 第一条记录,即使列值不是不同的(即 return null)
CREATE TABLE Person ("LAST_NAME" VARCHAR2(50 BYTE),
"TICKET_NUMBER" VARCHAR2(50 BYTE));
BEGIN
insert into Person(last_name,ticket_number) values('johnson','100');
insert into Person(last_name,ticket_number) values('smith','200');
END;
/
CREATE TABLE 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));
SELECT a.last_name,
a.ticket_number,
b.region,
b.state,
b.SEQ1,
B.A_CODE
FROM person a
BEGIN
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '111', 'FLL', 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', 'FLL', 3);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'FLL', 4);
END;
/
JOIN (SELECT ticket_number, MIN(SEQ) AS SEQ1,
MIN(region) AS region,
MIN(state) AS state, MIN(A_CODE) AS A_CODE
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;
A_CODE 值相同 - return 值
LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 FLL
但是,如果 A_CODE 值不是唯一的(即不相同),则 A_CODE 列的 return 为空并且 return 第二个 table. 注意:作为一个选项,如果不相等,列值不需要 return null。它可以 return 像 'not equal'
这样的文字LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 (NULL)
Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产
下面是查询,
SELECT a.last_name,
a.ticket_number,
b.region,
b.state,
b.SEQ1,
case when B.MIN_A_CODE = B.MAX_A_CODE then B.MIN_A_CODE else 'NULL' end A_CODE
FROM person a
JOIN ( SELECT ticket_number, MIN(SEQ) AS SEQ1,
MIN(region) AS region,
MIN(state) AS state, MIN(A_CODE) AS MIN_A_CODE, max(A_CODE) as MAX_A_CODE
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;
我在 table 个订单中又添加了一行。
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '111', 'FLL', 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', 'FLL', 3);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'FLL', 4);
insert into Orders(ticket_number, REGION, STATE, STORE_NUM, A_CODE, SEQ )
values('100', 'S', 'F1', '444', 'DLL', 4);
O/p -
LAST_NAME TICKET_NUMBER REGION STATE SEQ1 A_CODE
johnson 100 S F1 1 NULL
我的理解是因为对于同一区域你有不同的 A_CODE,你需要 A_CODE 为空,但所有其他列的值应该是第一条记录。
希望对您有所帮助