Oracle для многих же таблица - PullRequest
0 голосов
/ 25 февраля 2019

Я должен получить записи, которые имеют идентификаторы местоположения, охватывающие несколько идентификаторов контракта, также исключая дубликатыНиже приведен пример таблицы.Вторая таблица - это запрос с моим желаемым результатом.

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

Я пытался выполнить этот запрос, но он также включает в себя записи обоих контрактов Adobe CT4, которые имеют идентификатор местоположения, который не охватывает несколько идентификаторов контракта.Даже если я поставлю отличительное в начале запроса, эта пара идентификатора контракта CB4 / идентификатор местоположения не должна быть частью результатов.

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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете попробовать ниже - используя коррелированный подзапрос

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
0 голосов
/ 25 февраля 2019

Вы можете попробовать выполнить следующие действия, используя 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 

Онлайн-демонстрация

Редактировать:

Если вы хотите найти такой идентификатор местоположения, вы можете использовать следующий запрос.

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