2016-03-03 119 views
0

我有两个表:SQL查询返回的结果,如果所有的ID的有无匹配

COUNTRY,与两列COUNTRY_IDPERSON_REGION_ID

PERSON,具有很多列,其中列PERSON_REGION_ID是相同COUNTRY.PERSON_REGION_ID,和PERSON_IDPERSON ID列。

查询如下:

SELECT * 
from COUNTRY 
where PERSON_REGION_ID IN (
     SELECT PERSON_REGION_ID 
     FROM PERSON 
     WHERE PERSON_ID IN (111, 888))) 
    AND COUNTRY_ID = 44; 

上面的查询给出的结果,如果该ID的作为匹配任何一个(111或888)。

我希望查询得出的结果如果两个111和888有比赛,否则返回任何结果。

这是如何实现的?

+0

...你想返回的结果,如果是PersonID 111和888是PersonID有countryID 44 ...如果只有1人的2有没有countryID返回NULL我不明白? – Veljko89

+0

@ Veljko89 - 是的。究竟 – Satish

回答

0

一种选择是在子查询中使用group byhaving

select * 
from COUNTRY 
where PERSON_REGION_ID IN (
     select PERSON_REGION_ID 
     from PERSON 
     where PERSON_ID IN (111, 888)) 
     group by PERSON_REGION_ID 
     having count(PERSON_ID) = 2) 
    and COUNTRY_ID= 44; 

如果有重复person_id'sPERSON_REGION_ID,你需要使用distinctcount

+0

四处错误:ORA-00933:SQL命令不能正确地结束 – Satish

1

我宁愿用在这里加入

编辑:为了回答您的评论,这取决于它是否程序或只是查询。但是你声明变量,并与

去的方式,仅仅是为了记录...这是T-SQL,而不是Oracle的语法

declare @CountryID int -- = 44? (if for some reason you keep CountryID as type other 
         --  then int, just change it to correct one) 
declare @Person1 int -- = 111? 
declare @Person2 int -- = 888? 

select C.* from Country C 
join Person P1 on C.Person_Region_ID = P1.PersionRegion_ID and P1.Country_ID = @CountryID 
join Person P2 on C.Person_Region_ID = P2.PersionRegion_ID and P2.Country_ID = @CountryID 
where P1.PersionID = @Person1 and P2.PersionID = @Person2 
+0

@ Veljko89-感谢名单。人员ID是动态的。查询应该适用于任何数量的ID。如何做到这一点? – Satish

0

您可以使用EXISTS()这样的:

SELECT * from COUNTRY t 
    WHERE EXISTS(SELECT 1 FROM PERSON s 
       WHERE t.PERSON_REGION_ID = s.PERSON_REGION_ID 
        AND PERSON_ID IN (111, 888) 
       GROUP BY PERSON_REGION_ID 
       HAVING COUNT(DISTINCT PERSON_ID) = 2) 
     AND COUNTRY_ID = 44 
+0

(DISTINCT PERSON_ID)= 2)。 = 2部分可以动态完成? PERSION_ID在数字上是动态的 – Satish