Reputation: 455
I am new to hive and was trying to execute an query which contains nonequi join. But when I try to execute in hive 0.7 I am getting error due to nonequi join condition.
Query:
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 ;
Please provide me idea to rewrite this query without using nonequi join.
Upvotes: 2
Views: 760
Reputation: 1
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 );
Upvotes: 0
Reputation: 38325
Move non-equi join condition to the where clause:
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)
is necessary to allow left join, without this condition, left join will be transformed to inner join because non-equality condition alone as is will filter out nulls, see here.
Upvotes: 1