Oracle SQL中的自联接-基于1个相同列和1个不同列选择行
这可能不是一个自我加入我需要,但我有这个问题的困难,我希望有人能帮助我 样本数据:Oracle SQL中的自联接-基于1个相同列和1个不同列选择行,sql,oracle,oracle11g,self-join,Sql,Oracle,Oracle11g,Self Join,这可能不是一个自我加入我需要,但我有这个问题的困难,我希望有人能帮助我 样本数据: Row Code ReservationID ClientID EmployeeID 1 T 123 7777 John 2 T 456 2020 John 3 P 456 2020 John 4 P 9
Row Code ReservationID ClientID EmployeeID
1 T 123 7777 John
2 T 456 2020 John
3 P 456 2020 John
4 P 999 3100 Steve
5 P 876 3100 Steve
6 T 333 2424 John
7 P 333 2424 Lynda
期望输出:
Row Code ReservationID ClientID EmployeeID
2 T 456 2020 John
3 P 456 2020 John
6 T 333 2424 John
7 P 333 2424 Lynda
我正在寻找一个只返回第2、3、6和7行的查询
选择标准是当有一行代码为T,另一行代码为p,但保留ID和CLientID相同时。EmployeeID可能相同或不同(我希望在结果中返回EmployeeID,但不在选择条件中使用它)
阅读论坛我想我需要一个自我加入(我不知道怎么做)。如果您能提供任何帮助,我们将不胜感激!谢谢 一种方法使用
存在:
select t.*
from t
where (t.code = 'T' and exists (select 1 from t t2 where t2.reservationId = t.reservationId and t2.clientId = t.clientId and t2.code = 'P'
)
) or
(t.code = 'P' and exists (select 1 from t t2 where t2.reservationId = t.reservationId and t2.clientId = t.clientId and t2.code = 'T'
)
);
为了提高性能,您需要在(reservationId、clientId、code)上建立索引一个方法使用存在:
select t.*
from t
where (t.code = 'T' and exists (select 1 from t t2 where t2.reservationId = t.reservationId and t2.clientId = t.clientId and t2.code = 'P'
)
) or
(t.code = 'P' and exists (select 1 from t t2 where t2.reservationId = t.reservationId and t2.clientId = t.clientId and t2.code = 'T'
)
);
为了提高性能,您需要在(reservationId、clientId、code)
上建立索引。我认为更方便的方法是使用window函数。您可以为同一ReservationID
和ClientID
中的每一行按code
降序提供行号,然后根据此编号进行过滤:
SELECT Row, Code, ReservationID, ClientID, EmployeeID
FROM (SELECT Row, Code, ReservationID, ClientID, EmployeeID,
ROW_NUMBER() OVER (PARTITION BY ReservationID, ClientID
ORDER BY Code DESC) AS rn
FROM mytable) t
WHERE rn = 1
我认为更方便的方法是使用窗口功能。您可以为同一ReservationID
和ClientID
中的每一行按code
降序提供行号,然后根据此编号进行过滤:
SELECT Row, Code, ReservationID, ClientID, EmployeeID
FROM (SELECT Row, Code, ReservationID, ClientID, EmployeeID,
ROW_NUMBER() OVER (PARTITION BY ReservationID, ClientID
ORDER BY Code DESC) AS rn
FROM mytable) t
WHERE rn = 1
我认为最简单的解决办法是:
select distinct t1.*
from my_table t1
join my_table t2 on t1.reservationid = t2.reservationid
where t1.code = 'T' and t2.code = 'P'
or t1.code = 'P' and t2.code = 'T';
我认为最简单的解决办法是:
select distinct t1.*
from my_table t1
join my_table t2 on t1.reservationid = t2.reservationid
where t1.code = 'T' and t2.code = 'P'
or t1.code = 'P' and t2.code = 'T';
非常感谢。我现在正在测试这个,但是它需要很长时间才能运行。将很快报告…它将永远运行并失败。如果我提到的表中有更多的列呢?我是否必须在子选择中包含表中的每一列?由于我公司技术环境的限制和源数据表的大小,该操作失败,但您建议的查询很好。非常感谢。非常感谢。我现在正在测试这个,但是它需要很长时间才能运行。将很快报告…它将永远运行并失败。如果我提到的表中有更多的列呢?我是否必须在子选择中包含表中的每一列?由于我公司技术环境的限制和源数据表的大小,该操作失败,但您建议的查询很好。非常感谢。它永远运行,但失败了。如果我提到的表中有更多的列呢?我是否必须将表中的每一列都包含在联接中?由于公司技术环境的限制和源数据表的大小,联接失败,但您建议的查询很好。非常感谢。它永远运行,但失败了。如果我提到的表中有更多的列呢?我是否必须将表中的每一列都包含在联接中?由于公司技术环境的限制和源数据表的大小,联接失败,但您建议的查询很好。非常感谢。