如何在 oracle 中找到没有相同案例的人?
How can I get the person with same case no in oracle?
我有一个名为 CASE_PERSON
的 table。DDL 是
CREATE TABLE CASE_PERSON
(
ID VARCHAR2(50) NOT NULL PRIMARY KEY,
p_id VARCHAR2(50) DEFAULT NULL NOT NULL,
id_card VARCHAR2(18) DEFAULT NULL NOT NULL,
p_name VARCHAR2(50) NOT NULL,
case_no VARCHAR2(60) NOT NULL,
case_name VARCHAR2(200) NOT NULL,
)
还有一些 DML
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('001', '123', '123-123123', 'tom', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('002', '234', '123-123234', 'rose', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('003', '345', '123-123345', 'jack', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('005', '555', '123-123555', 'roman', 'c-002', 'case-two');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('006', '666', '123-123666', 'jim', 'c-002', 'case-two');
table 是从 Person
table 和 case
table 构建的。带 p 的前缀来自 PERSON
,大小写来自 CASE
。首先,我从 PERSON
获取所有身份证并从 CASE_PERSON
查询以找到具有相同案例的人匹配给定的身份证。
现在我想得到名为 'person with same case' 的结果。输出应为以下格式:
id p_id id_card case_no case_name same_case_id_card same_case_p_name
1 123 123-123123 c-001 case-one 123-123234 rose
2 123 123-123123 c-001 case-one 123-123345 jack
3 555 123-123555 c-002 case-two 123-123666 jim
如何查询?
我认为您要查找的查询是:
SELECT * FROM case a, case b
WHERE a.case_no = b.case_no;
您似乎想要第一人称的案例详细信息,与非第一人称的人员详细信息交叉:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY case_no ORDER BY p_id) as rown FROM case_person
)
SELECT
ROW_NUMBER() OVER(ORDER BY two.p_id) as id,
one.p_id,
one.id_card,
one.case_no,
one.case_name,
two.id_card as same_case_id_card,
two.case_name as same_case_p_name
FROM
(SELECT * FROM cte WHERE rown = 1) one
INNER JOIN
(SELECT * FROM cte WHERE rown > 1) two
ON one.case_no = two.case_no
我有一个名为 CASE_PERSON
的 table。DDL 是
CREATE TABLE CASE_PERSON
(
ID VARCHAR2(50) NOT NULL PRIMARY KEY,
p_id VARCHAR2(50) DEFAULT NULL NOT NULL,
id_card VARCHAR2(18) DEFAULT NULL NOT NULL,
p_name VARCHAR2(50) NOT NULL,
case_no VARCHAR2(60) NOT NULL,
case_name VARCHAR2(200) NOT NULL,
)
还有一些 DML
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('001', '123', '123-123123', 'tom', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('002', '234', '123-123234', 'rose', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('003', '345', '123-123345', 'jack', 'c-001', 'case-one');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('005', '555', '123-123555', 'roman', 'c-002', 'case-two');
insert into CASE_PERSON(ID, P_ID, ID_CARD, P_NAME, CASE_NO, CASE_NAME)
values ('006', '666', '123-123666', 'jim', 'c-002', 'case-two');
table 是从 Person
table 和 case
table 构建的。带 p 的前缀来自 PERSON
,大小写来自 CASE
。首先,我从 PERSON
获取所有身份证并从 CASE_PERSON
查询以找到具有相同案例的人匹配给定的身份证。
现在我想得到名为 'person with same case' 的结果。输出应为以下格式:
id p_id id_card case_no case_name same_case_id_card same_case_p_name
1 123 123-123123 c-001 case-one 123-123234 rose
2 123 123-123123 c-001 case-one 123-123345 jack
3 555 123-123555 c-002 case-two 123-123666 jim
如何查询?
我认为您要查找的查询是:
SELECT * FROM case a, case b
WHERE a.case_no = b.case_no;
您似乎想要第一人称的案例详细信息,与非第一人称的人员详细信息交叉:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY case_no ORDER BY p_id) as rown FROM case_person
)
SELECT
ROW_NUMBER() OVER(ORDER BY two.p_id) as id,
one.p_id,
one.id_card,
one.case_no,
one.case_name,
two.id_card as same_case_id_card,
two.case_name as same_case_p_name
FROM
(SELECT * FROM cte WHERE rown = 1) one
INNER JOIN
(SELECT * FROM cte WHERE rown > 1) two
ON one.case_no = two.case_no