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 Adobe 合同的记录,这些合同具有不跨越多个合同 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
编辑:
如果你想找到这样的位置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
您可以尝试以下 - 使用相关子查询
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
我必须提取具有跨越多个合同 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 Adobe 合同的记录,这些合同具有不跨越多个合同 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
编辑:
如果你想找到这样的位置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
您可以尝试以下 - 使用相关子查询
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