ids的SQL查询,从不显示特殊组合

时间:2016-08-23 12:52:13

标签: sql kylin

我有两张表,比如

@Test
public void TC_01_LoginToSSOApplicationViaInstructor() {     
    System.out.println("1");
}

@Test
public void TC_02_InstructorCreatesCourse() {     
    System.out.println("2");

}

@Test
public void TC_03_LoginToSSApplicationViaStudent() {
    System.out.println("3");
}

@Test
public void TC_04_EnrollStudentInCourse() {

}

id_a | id_b
-----------
01   | 011
01   | 012
02   | 021
02   | 022

这些表在id_b上加入。 现在我想知道没有id_b | cl | ds ------------------ 011 | F9.00 | G 012 | F3.00 | G 021 | F9.00 | P 022 | G7.50 | G 组合的每个Id_a。所以在这种情况下,我想要的结果是F9.00 | G。即使行[{1}}与02要求不符,我也不希望01 | 012 | F3.00 | GF9.00 | G,因为0101 |011 | F9.00 | G的组合} 01

目前无法想到一个简单的查询。也许有些人有个主意。

问候,Søren

3 个答案:

答案 0 :(得分:1)

这样的事情:

select t1.id_a
from t1
  join t2 on t1.id_b = t2.id_b
where (t2.cl, t2.ds) <> ('F9.00', 'G')
group by t1.id_a
having count(*) = (select count(*) 
                   from t1 as t3
                   where t3.id_a = t1.id_a);

这会获得不存在'F9.00', 'G'组合的行,只会显示那些结果行数与id_a的总行数相同的行。

在指定平台后编辑:

以上是ANSI SQL - 我不知道kylin是否支持ANSI SQL。如果where (t2.cl, t2.ds) <> ('F9.00', 'G')不起作用,则需要使用where t2.cl <> 'F9.00' and t2.ds <> 'G'

答案 1 :(得分:0)

select id_a
from table1
except
select t1.id_a
from table1 t1
inner join table2 t2
on t1.id_b=t2.id_b
where t2.c1 = F9.00
and t2.ds = G

此代码将获取底部不需要的ID,顶部的所有ID,然后将其排除

答案 2 :(得分:0)

您可以在列c1和ds:

上使用CONCAT
SELECT DISTINCT id_a
FROM T1 INNER JOIN T2
ON T1.id_b = T2.id_b
WHERE id_a NOT IN
(SELECT id_a
 FROM T1 INNER JOIN T2
 ON T1.id_b = T2.id_b
 WHERE CONCAT(c1, ds) = 'F9.00G')