Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL中的自联接-基于1个相同列和1个不同列选择行_Sql_Oracle_Oracle11g_Self Join - Fatal编程技术网

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';

非常感谢。我现在正在测试这个,但是它需要很长时间才能运行。将很快报告…它将永远运行并失败。如果我提到的表中有更多的列呢?我是否必须在子选择中包含表中的每一列?由于我公司技术环境的限制和源数据表的大小,该操作失败,但您建议的查询很好。非常感谢。非常感谢。我现在正在测试这个,但是它需要很长时间才能运行。将很快报告…它将永远运行并失败。如果我提到的表中有更多的列呢?我是否必须在子选择中包含表中的每一列?由于我公司技术环境的限制和源数据表的大小,该操作失败,但您建议的查询很好。非常感谢。它永远运行,但失败了。如果我提到的表中有更多的列呢?我是否必须将表中的每一列都包含在联接中?由于公司技术环境的限制和源数据表的大小,联接失败,但您建议的查询很好。非常感谢。它永远运行,但失败了。如果我提到的表中有更多的列呢?我是否必须将表中的每一列都包含在联接中?由于公司技术环境的限制和源数据表的大小,联接失败,但您建议的查询很好。非常感谢。