2013-02-13 97 views
1

我可以將q1q2組合成單個查詢嗎?替代查詢以加入兩個單獨的查詢

我需要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_infosell_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 BYDISTINCT消除了由於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 2013-02-13 07:33:47

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

使用內部連接的第一個答案是正確的。

如果你想有一個更快的查詢,您可以使用相交如下:

選擇CUST_ID從sell_info 相交 選擇CUST_ID FROM cust_info;

它比內部連接速度快兩倍,但唯一的缺點是隻能獲得兩個表中通用的字段。如果你需要其他領域,那麼最好的選擇是內部連接。