2013-02-13 5 views
1

Могу ли я объединить q1 и q2 в одном запросе?Альтернативный запрос для объединения двух отдельных запросов

Мне нужен альтернативный запрос в Hive.

SELECT q3.* 
FROM (
      (
       SELECT prod_id, 
         prod_name, 
         cust_id 
       FROM sell_info 
       GROUP BY 
         prod_id, 
         prod_name, 
         cust_id 
      )q1 
      JOIN 
      (
       SELECT cust_name, 
         cust_address 
       FROM cust_info 
       WHERE cust_type LIKE 'Reg%' 
      )q2 
      ON q1.cust_id = q2.cust_id 
     ) q3; 

ответ

3

Вы можете JOIN две таблицы cust_info и sell_info непосредственно без подзапросов, например, так:

Select DISTINCT * 
FROM sell_info AS s 
INNER JOIN cust_info AS c ON s.cust_id = c.cust_id 
WHERE c.cust_type like 'Reg%'; 

Обратите внимание, что: Там не было никакой необходимости GROUP BY prod_id, prod_name, cust_id, и в то же время, которое вы выбираете только эти три столбца:

SELECT prod_id, 
      prod_name, 
      cust_id 
    FROM sell_info 
    GROUP BY 
      prod_id, 
      prod_name, 
      cust_id 

Это просто может быть достигнуто с использованием ключевого слова DISTINCT без необходимости GROUP BY. DISTINCT устраняет дубликаты, которые появляются из-за JOIN.

0

вы можете использовать это также:

SELECT a.prod_id, 
     a.prod_name, 
     a.cust_id, 
     b.cust_name, 
     b.cust_address 
FROM sell_info a 
inner join cust_info b on a.cust_id = b.cust_id 
where b.cust_type LIKE 'Reg%' 
+0

Вы забыли о статье 'GROUP BY'. – andr

0

Вы можете использовать внутреннее соединение, если вы хотите увидеть только те клиента и данные о продукте, чьи cust_is существуют в обеих таблицах.

Select prod_id, 
     prod_name, 
     cust_info.cust_id, 
     cust_name, 
     cust_address 
from sell_info inner join cust_info 
     on sell_info.cust_id=cust_info.cust_id 
where cust_type LIKE 'Reg%' 
0

Первый ответ с использованием внутреннего соединения является правильным.

Если вы хотите быстрее запрос, который вы можете использовать Intersect следующим образом:

выберите cust_id ОТ sell_info Intersect выберите cust_id FROM cust_info;

Это вдвое быстрее, чем внутреннее соединение, но единственным недостатком является то, что вы можете получать только поля, которые являются общими в обеих таблицах. Если вам нужны другие поля, лучшим вариантом является внутреннее соединение.

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