2017-03-03 61 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