【问题标题】:Unable to use nonequi join(<=) in hive无法在 hive 中使用 nonequi join(<=)
【发布时间】:2023-03-24 13:28:01
【问题描述】:

我是 hive 新手,正在尝试执行一个包含 nonequi join 的查询。 但是当我尝试在 hive 0.7 中执行时,由于非等连接条件而出现错误。

查询:

SELECT * INTO  dbo.tbl_B
 FROM ( select 
    Id,
    Name,
    Age,
    SellingPrice,
    row_number() OVER ( PARTITION BY Id,Name
ORDER BY Age asc) AS row_no
from tbl_A
LEFT JOIN dbo.tbl_C
ON A.[Id]=C.[Id]
and A.SellingPrice  <= C.BuyingPrice
) AA
WHERE row_no = 1 ;

请告诉我在不使用 nonequi join 的情况下重写此查询的想法。

【问题讨论】:

    标签: hive left-join hiveql


    【解决方案1】:

    将非等连接条件移至 where 子句:

    SELECT * 
     FROM ( select 
            Id,
            Name,
            Age,
            SellingPrice,
            row_number() OVER ( PARTITION BY Id,Name ORDER BY Age asc) AS row_no
    from tbl_A
    LEFT JOIN dbo.tbl_C
    ON A.[Id]=C.[Id]
    where (A.SellingPrice  <= C.BuyingPrice) OR (C.BuyingPrice is null)
    ) AA
    WHERE row_no = 1 ;
    

    OR (C.BuyingPrice is null) 是允许左连接所必需的,如果没有这个条件,左连接将被转换为内连接,因为单独的不相等条件会过滤掉空值,请参阅here

    【讨论】:

      【解决方案2】:
      Solution not working for me
      
      query used:
      
      CREATE TABLE  IMART_PREP.TST (STRT_DT DATE , END_DT DATE, ID INT , SALARY INT );
      
      INSERT INTO IMART_PREP.TST VALUES (   '2018-01-01' ,   '2018-01-31' ,1, 1000);
      INSERT INTO IMART_PREP.TST VALUES (  '2018-02-01' , '2018-02-28' , 1, 2000);
      INSERT INTO IMART_PREP.TST VALUES (  '2018-03-01' ,  '2018-03-30' , 1, 3000);
      INSERT INTO IMART_PREP.TST VALUES (  '2018-04-01' ,  '2018-04-30' , 1, 4000);
      SELECT * FROM IMART_PREP.TST;
      
      CREATE TABLE  IMART_PREP.TST_1 (STRT_DT DATE , END_DT DATE, ID INT , SALARY INT );
      INSERT INTO IMART_PREP.TST_1 VALUES (   '2018-01-01' ,   '2018-01-31', 1, 1000);
      
      
      SELECT *
      FROM IMART_PREP.TST A ,  IMART_PREP.TST_1 B
      WHERE  ( (A.ID = B.ID ) AND (A.STRT_DT BETWEEN B.STRT_DT AND B.END_DT ) ) OR (B.STRT_DT IS NULL );
      

      【讨论】:

      • “解决方案对我不起作用”是什么意思?请解释您的答案是如何工作的,或者至少可以帮助 OP 找到解决方案,或者如果两者都没有,请删除您的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多