2016-08-23 5 views
0

У меня есть 2 таблицы, какSQL запросов для идентификаторов, которые никогда не показывают специальную комбинацию

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. Теперь я хочу знать каждый Id_a, где нет комбинации F9.00 | G. Поэтому в этом случае мой желаемый результат: 02. Несмотря на то, что строка 01 | 012 | F3.00 | G не соответствует требованиям F9.00 | G, я не хочу иметь 01 в результате, потому что есть комбинация 01 |011 | F9.00 | G с 01 как id_a.

Невозможно представить простой запрос на данный момент. Возможно, у некоторых из вас есть идея.

С уважением, Сорен

+1

, что РСУБД? mySQL, SQL SERVER еще? и что вы пробовали? это похоже на прямой вперед, а не влево или слева, где null .. – xQbert

+0

Укажите ожидаемый результат (в виде таблицы, как у вас уже есть). – jarlh

+0

его в kylin, который использует calcite как queryengine. результатом должен быть только один столбец с идентификатором id_a в пользовательском интерфейсе –

ответ

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 

Этот код будет захватывать идентификаторы вы не хотите в нижней части, все идентификаторы в верхней, а затем исключит их

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' не существует, и только те, в которых в результате чего количество строк для этого является таким же, как общей ROWCOUNT для этого id_a.


Edit, после того, как платформа была определена:

выше, является ANSI SQL - я не знаю, если Kylin поддерживает ANSI SQL. Если where (t2.cl, t2.ds) <> ('F9.00', 'G') не работает, вам нужно использовать where t2.cl <> 'F9.00' and t2.ds <> 'G'

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') 

 Смежные вопросы

  • Нет связанных вопросов^_^