2016-09-29 8 views
0

誰かが次のことを行う方法を説明できますか? 私はテーブルの人と家を持っています。

パーソン:行の1つが条件を満たすときに行を選択しないでください

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

I次のような状況があります。 私は彼が持っている場合は、この人を選択するタイプの「ビッグ」と一緒に家を持っている人を選択しないようにする必要がありますがtypeが "small"の家、typeが "big"と "undefined"の2つの家があり、 "Undefined"の家のhouse idを選択していない人を選択します。

だから、結果は(ちょうどこの1行)でなければなりません

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

動作するはず? –

+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を選択している場合タイプが "Undefined"の家の

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

次のクエリを使用することができます。

INオペレータが使用するサブクエリが PersonId両方の「ビッグ」と「未定義の家のタイプに関連する値と ない関連を返す

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) 
「小さな」ものに

Demo here

0

これは、あなたが使用しているDBMS

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' 
関連する問題