2014-09-06 4 views
0

Я пытаюсь сделать перекресток на только один колонке (map_id), но и вернуть еще один столбец (атр):Intersect только на одной колонке, возвращение других

SELECT map_id, attr 
FROM Attr 
WHERE attr_id = 0 AND val = '123' 
INTERSECT 
SELECT map_id, attr 
FROM Attr 
WHERE attr_id = 20 AND val = '456' 

Однако, если пара map_id и атр не совпадают, пересечение не работает (очевидно). Как сделать пересечение на map_id, но вернуть список attrs? Он в конечном итоге становится частью предложения col In() более крупного запроса.

Например:

--------------------------------- 
Attr_Id Attr Val Map_Id 
--------------------------------- 
0   '1'  '123' 1 
0   '2'  '123' 2 
10   '3'  '123' 1 
10   '4'  '123' 2 
20   '5'  '456' 1 
20   '6'  '456' 2 
30   '7'  '456' 1 
30   '8'  '456' 2 

Я хочу его вернуть

---------------- 
Attr_Id Attr 
---------------- 
0   '1' 
20   '5' 
+0

@GordonLinoff обновлял его для ясности – Kristin

+0

@Kristin в исходном запросе вы использовали две таблицы, это один использует только одну таблицу. Правильно это или было первым? –

+0

@BrianDeMilia Я использую 2, но проблема может быть объяснена более четко в одном. основная проблема заключается в том, что некоторые из атрибутов attr_id одинаковы, поэтому, если у нас есть список только attr_ids, когда мы переходим к выполнению большего запроса на него, он будет тянуть несвязанные строки. – Kristin

ответ

1

Вы, кажется, хотите найти подходящие атрибуты для map_id, когда map_id имеет оба атрибута. Существуют различные способы подхода к этому запросу. Вот один из способов:

select a.attr_id, a.attr 
from Attr a 
where (attr_id = 0 and val = '123' or 
     attr_id = 20 and val = '456' 
    ) and 
     2 = (select count(distinct a2.attr_id) 
      from attr a2 
      where a2.map_id = a.map_id and 
       (a2.attr_id = 0 and a2.val = '123' or 
       a2.attr_id = 20 and a2.val = '456' 
       ) 
     ) 
0

Try:

select a.attr_id, a.attr 
    from (select map_id 
      from attr 
     where attr_id = 0 
      and val = '123' 
     intersect 
     select map_id 
      from attr 
     where attr_id = 20 
      and val = '456') v 
    join attr a 
    on v.map_id = a.map_id 

Причина возвращает каждая запись, потому что ваши 2 запросов и получения значения MAP_ID 1 и 2. Таким образом, каждая строка таблицы с MAP_ID 1 или 2 будет возвращена. Это не соответствует ожидаемому результату, но соответствует вашим объяснениям.