Oracle 对许多相同 Table

Oracle to many Same Table

我必须提取具有跨越多个合同 ID 的位置 ID 的记录,还要排除重复记录。下面是一个示例 table。第二个 table 是具有我想要的结果的查询。

| CONTRACT ID | LOCATION ID | CONTRACT NAME | CONTRACT DATE | CONTRACT STATUS |
--------------------------------------------------------------------------
|  CT1          |  100      | MICROSOFT     | 12/09/2029    |   PENDING        
|  CT1          |  100      | MICROSOFT     | 12/09/2029    |   APPROVED       
|  CT3          |  155      | YAHOO         | 02/03/2030    |   EXPIRED       
|  CT4          |  180      | ADOBE         | 02/03/2030    |   IN LITIGATION       
|  CT4          |  180      | ADOBE         | 02/03/2030    |   APPROVED       
|  CT5          |  199      | YAHOO         | 02/03/2030    |   PENDING       
|  CT6          |  100      | GOOGLE        | 10/23/2028    |   PENDING       
|  CT7          |  155      | UBER          | 05/15/2027    |   PENDING       
---------------------------------------------------------------------------

| CONTRACT ID   | LOCATION ID  |
----------------------------------
|  CT1          |  100         |
|  CT6          |  100         |
|  CT3          |  155         |
|  CT7          |  155         |
-----------------------------------

我尝试 运行 此查询,但它还包括两个 CT4 Adob​​e 合同的记录,这些合同具有不跨越多个合同 ID 的位置 ID。 即使我在查询的开头放置一个 distinct,该合同 CB4 id/location id 对也不应该是结果的一部分。

SELECT contract_id, location_id from random_table where location_id in
    (SELECT location_id FROM random_table
    where (location_id is not null)
    group by location_id  having count( location_id) > 1 )
    group by contract_id, location_id
    order by location_id

您可以尝试使用 WHERE EXISTS

SELECT contractid, 
       locationid 
FROM   [youtable] y 
WHERE  EXISTS (SELECT 1 
               FROM   [youtable] TY 
               WHERE  TY.locationid = Y.locationid 
                      AND TY.contractid <> Y.contractid) 
GROUP  BY contractid, 
          locationid 
ORDER  BY locationid 

Online Demo

编辑:

如果你想找到这样的位置id,你可以使用下面的查询。

SELECT ty.locationid 
FROM   tablename TY 
       INNER JOIN tablename y 
               ON TY.locationid = Y.locationid 
                  AND TY.contractid <> Y.contractid 
GROUP  BY ty.locationid 

您可以尝试以下 - 使用相关子查询

DEMO

select distinct location_id, contractid
from tablename a
where exists (select 1 from tablename b where a.location_id=b.location_id
having count(distinct b.contractid)>1)

输出:

LOCATIONID  contractid
100           CT1
155           CT3
100           CT6
155           CT7