2016-09-29 112 views
0

有人可以解释如何做下列事情吗? 我有一张桌子的人和房子。

人:当其中一行满足条件时不要选择行

| Person id | Person Name | 
    | 1   | One   | 
    | 2   | Two   | 

房子:

| House id | Person Id | House type | 
    | 1  | 1   | Small  | 
    | 2  | 1   | Big  | 
    | 3  | 1   | Undefined | 
    | 4  | 2   | Big  | 
    | 5  | 2   | Undefined | 

我有以下情况: 我需要选择的人谁拥有了一套住宅,类型为“大”,而不是选择这个人,如果他有类型为“小”的房屋,如果他有两个类型为“大”和“未定义”的房屋,则选择人,但不选择类型为“未定义”的房屋的房屋编号。

所以结果应该是(仅这一个排)

| Person id | House id | 
| 2   | 4  | 
+0

哪些DBMS您使用的工作吗? –

+0

你正在离开很多组合,例如,如果他有大/大/大/未定义,......会发生什么?也许你可以用另一种方式解释理想的结果? –

+0

人1和人2都有大和未定义为什么人1不在列表中? – Stivan

回答

2

把它一步一步

,我需要选择的人谁拥有了一套住宅,类型为“大”

SELECT DISTINCT PersonID, HouseID 
FROM HOUSES 
WHERE HouseType = 'Big' 

而不是选择这个人,如果他有房e为类型为 “小”,

SELECT DISTINCT PersonID, HouseID 
FROM HOUSES 
WHERE HouseType = 'Big' 
    AND PersonID NOT IN (SELECT PersonID FROM HOUSES WHERE HouseType = 'small') 

选择的人,如果他有2间房子,类型为 “大” 和 “未定义”

(SELECT PersonID FROM HOUSES WHERE HouseType = 'big') 
UNION 
(SELECT PersonID FROM HOUSES WHERE HouseType = 'undefined') 

但不选择内部ID类型为“未定义”的房子。

SELECT DISTINCT PersonID, HouseID 
FROM HOUSES 
WHERE PersonID IN (
    (SELECT PersonID FROM HOUSES WHERE HouseType = 'big') 
    UNION 
    (SELECT PersonID FROM HOUSES WHERE HouseType = 'undefined') 
) 
    AND HouseType != 'undefined' 
0

您可以使用下面的查询:

SELECT PersonId, HouseId 
FROM Houses 
WHERE HouseType = 'Big' AND 
     PersonId IN (SELECT PersonId 
        FROM Houses 
        GROUP BY PersonId 
        HAVING COUNT(CASE WHEN HouseType = 'Big' THEN 1 END) >= 1 AND 
          COUNT(CASE WHEN HouseType = 'Small' THEN 1 END) = 0 AND 
          COUNT(CASE WHEN HouseType = 'Undefined' THEN 1 END) >= 1) 

IN操作中使用的子查询返回涉及到两个“大”和“不确定”户型PersonId值,而不是相关到“小”的。

Demo here

0

这应该

select case2.Person_ID, case2.House_ID 
from (
     (-- Removes persons with Big and Small houses 
      select Person_ID, count(*) as Cnt from Houses 
       where House_Type in ('Big', 'Small') 
      group by Person_ID 
      having count(*) = 1 
     ) case1 
     inner join 
     (
      select Person_ID, House_ID, House_Type from Houses 
       where House_Type in ('Big', 'Undefined') 
     ) case2 on case1.Person_ID = case2.Person_ID 
    ) 
where House_Type <> 'Undefined' 
相关问题