我有两张表,比如
@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 | G
为F9.00 | G
,因为01
与01 |011 | F9.00 | G
的组合} 01
。
目前无法想到一个简单的查询。也许有些人有个主意。
问候,Søren
答案 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')