0

我有 2 张桌子

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

id_b |  cl   | ds
------------------
011  | F9.00 | G
012  | F3.00 | G
021  | F9.00 | P
022  | G7.50 | G

这些表在 id_b 上连接。现在我想知道没有F9.00 | G. 所以在这种情况下,我想要的结果是02. 即使该行01 | 012 | F3.00 | G不符合F9.00 | G要求,我也不希望有01结果,因为有01 |011 | F9.00 | Gas01的组合id_a

目前想不出一个简单的查询。也许你们中的一些人有一个想法。

问候, 索伦

4

3 回答 3

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'存在组合的行,并且仅获取结果行数与 that 的总行数相同的行id_a


编辑,指定平台后:

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

于 2016-08-23T13:05:29.670 回答
0

您可以CONCAT在 c1 和 ds 列上使用:

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')
于 2016-08-23T13:59:04.757 回答
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,然后将它们排除在外

于 2016-08-23T12:58:23.150 回答