2017-03-03 63 views
0

這裏是我的數據:
T1比賽在IN子句的所有值

P.ID UniqueID Value  
1  1  Apple  
1  2  Orange  
1  3  Grapes  
2  4  Peach  
2  5  Orange  
2  6  Banana 

T2(查找表)

Value 
Apple 
Orange 
Grapes 
Peach 
Melon 
Berry 

我需要的數據分類成2類:

  • 如果T1中每個父ID的所有記錄都有T2中的匹配,則Type1
  • 如果T1中的任何一個父記錄的記錄在T2中沒有 匹配,則爲Type2。

目前,我使用IN子句來查詢T2

select ID from T1 where T1.value in(select value from T2) 

但我似乎得到的是沒有比賽在T2以及使用thie邏輯記錄。我如何區分這些?在上面我的例子中,ID 2應該是2類型和ID 1類型1

+0

什麼所需的輸出樣子?每個不同的'P_id'都有一行? (不要在列名中使用點!)或表T1'中每行的一行? – mathguy

+0

所需輸出僅爲P_ids。 – Skn

+0

此外,我需要兩個單獨的查詢兩種類型。 – Skn

回答

1

您可以使用此查詢:如果您需要兩個查詢反正

select T1.ID, 
      case count(*) when count(T2.value) 
      then 'Type1' 
      else 'Type2' 
      end as Type 
from  T1 
left join T2 on T1.value = T2.value 
group by T1.ID 
0

要獲得類型2:

select unique p_id from t1 where value not in (select value from t2) 

然後將結果保存(存儲)在臨時表中,或者將其作爲視圖。無論哪種方式,假設你稱之爲t3。

要獲得類型1:

select unique p_id from t1 where p_id not in (select p_id from t3) 
+0

這不起作用,因爲P_id#2有2個其他值在T2。所以#2將出現在類型1而不是類型2. – Skn

+0

@Skn - 你認爲它不會工作,或者你嘗試?當你說「這個」時,你指的是第一個查詢還是第二個查詢? (我問你是因爲你錯了,但是爲了告訴你爲什麼,我需要知道你的意思。) – mathguy

0

你可以用它爲每一行單獨檢查,如果在查找表中存在價值的臨時結果,然後選擇這些檢查各組max。從而,如果一組中的至少一個排具有沒有參考(即,用於該行中的Type 2),則max該組是Type 2,也:

select id, max(type) 
from 
    (select id, nvl(t2.value,'Type 2', 'Type 1') as type 
    from t1 left join t2 on t1.value = t2.value) 
group by id