[SQL] SQL 쿼리 테이블에 가입하기
SQLSQL 쿼리 테이블에 가입하기
select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table
as prod_and_ts;
위의 쿼리를 사용하여, 나는 아래의 출력을 얻고있다.
USER_ID | PRODUCT_ID | TIMESTAMPS
------------+------------------+-------------
1015826235 220003038067 1004841621
1015826235 300003861266 1005268799
1015826235 140002997245 1061569397
1015826235 *200002448035* 1005542471
당신은 표 2 데이터 아래 다음 위 출력의 마지막 줄에서 PRODUCT_ID는 표 2 데이터 아래의 마지막 줄에 ITEM_ID과 일치하지 않습니다와 쿼리에서 위의 출력을 비교하면.
BUYER_ID | ITEM_ID | CREATED_TIME
-------------+-------------------+------------------------
1015826235 220003038067 2001-11-03 19:40:21
1015826235 300003861266 2001-11-08 18:19:59
1015826235 140002997245 2003-08-22 09:23:17
1015826235 *210002448035* 2001-11-11 22:21:11
내 질문은 그래서
표 2 찾기 모든 데이터 또는 특정 BUYER_ID USER_ID에 대응 일치하지 않는 그 PRODUCT_ID (ITEM_ID) 및 타임 스탬프 (CREATED_TIME).
나는 위의 예 -이 같은 결과를 보여줄 필요가 그래서
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | TIMESTAMPS
-----------+-------------------+-------------------------+---------------+------------------+------------------
1015826235 *210002448035* 2001-11-11 22:21:11 1015826235 *200002448035* 1005542471
나는 위의 결과를 얻기 표 2에 쓴 위의 질의에 가입해야합니다. 그래서 합류 과정에서 내 위의 쿼리를 사용해야합니다. 그것은 나에게 많은 혼란. 어떤 제안을 이해할 수있을 것이다.
최신 정보:-
나는 쿼리 아래를 썼다, 그러나 어떻게 든 내가 달성 싶다고 출력을 달성 할 수 없습니다입니다. 이와 캔 사람의 도움 나?
SELECT table2.buyer_id, table2.item_id, table2.created_time from
(select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as
timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table
as prod_and_ts) prod_and_ts JOIN table2 where
prod_and_ts.user_id = table2.buyer_id
and (product_id <> table2.item_id or
timestamps <> UNIX_TIMESTAMP(table2.created_time));
해결법
-
==============================
1.난 당신이 두 개의 쿼리와 함께 원하는 것을 할 수 있다고 생각하지만, 나는 확실히 100 % 아니에요. 종종이 상황에서, 두 번째 테이블에 일치하지 않는 첫 번째 테이블에서 일을 찾기 위해 충분하다. 또한이 도전하는 이유입니다 "가장 가까운"일치를 얻기 위해 노력하고 있습니다.
난 당신이 두 개의 쿼리와 함께 원하는 것을 할 수 있다고 생각하지만, 나는 확실히 100 % 아니에요. 종종이 상황에서, 두 번째 테이블에 일치하지 않는 첫 번째 테이블에서 일을 찾기 위해 충분하다. 또한이 도전하는 이유입니다 "가장 가까운"일치를 얻기 위해 노력하고 있습니다.
사용자 ID에 일치하고 다른 두 분야의 정확히 한 다음이를 결합에 대한 다음 쿼리 외모 :
SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table as prod_and_ts ) prod_and_ts JOIN table2 on prod_and_ts.user_id = table2.buyer_id and prod_and_ts.product_id = table2.item_id and prod_and_ts.timestamps <> UNIX_TIMESTAMP(table2.created_time) union all SELECT table2.buyer_id, table2.item_id, table2.created_time, prod_and_ts.* from (select user_id, prod_and_ts.product_id as product_id, prod_and_ts.timestamps as timestamps from testingtable2 LATERAL VIEW explode(purchased_item) exploded_table as prod_and_ts ) prod_and_ts JOIN table2 on prod_and_ts.user_id = table2.buyer_id and prod_and_ts.product_id <> table2.item_id and prod_and_ts.timestamps = UNIX_TIMESTAMP(table2.created_time)
이 중 필드에 일치가없는 상황을 찾을 수 없습니다.
또한, 나는 오히려 "여기서"보다 "의"구문을 사용하여이 서면으로 작성했습니다. 나는 HIVE이 지원 가정합니다.
-
==============================
2.귀하의 담당자는 중복과 같은 질문 특히이 중복 열이 너무 높습니다.
귀하의 담당자는 중복과 같은 질문 특히이 중복 열이 너무 높습니다.
HiveQL (하둡)를 사용하여 하이브 가입 두 테이블
두 테이블을 가입하고 둘의 출력을 얻을
당신은 레코드가 세 번째 시나리오에 대한 백업 묶을 수있는 충분한 정보를 가지고 있지 않습니다. 당신은 OR로 완전 외부 조인을하고 모든 것을 다시 얻을, 당신은 당신이 목록 제 1 및 제 2 경우와 같이 충분한 정보를 가지고 행을 일치하고 필드에 null로 행을 반환하여 당신이하지 않는 RECS를 식별 할 수 있습니다 세번째 시나리오에서, 비 매칭 테이블.
SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* FROM SO_Table1HIVE A FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] AND (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID)
세 번째 시나리오에 일치하도록 노력하는 것은 해킹합니다 - 정보가없는
이것은 다른 날에 일치하지 않는 지정한 날짜에 대한 그들을 일치하지만, 다시는 데카르트의 제품을 얻을 것이다.
SELECT DATEPART(d,B.T1time),DATEPART(d,A.Created_TIME),* FROM SO_Table1HIVE A FULL OUTER JOIN SO_Table2HIVE B ON A.BUYER_ID = B.[USER_ID] AND ( (B.t1time = A.Created_TIME OR B.PRODUCTID = A.ITEM_ID) OR ( (A.Created_TIME <> B.t1time AND B.PRODUCTID <> A.ITEM_ID AND DATEPART(d,B.T1time) = DATEPART(d,A.Created_TIME)) AND a.ITEM_ID NOT IN(SELECT ITEM_ID FROM SO_Table1HIVE A2 INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) ) AND B.PRODUCTID NOT IN(SELECT PRODUCTID FROM SO_Table1HIVE A2 INNER JOIN SO_Table2HIVE B2 ON A2.BUYER_ID = B2.[USER_ID] AND (A2.Created_TIME = B2.t1time OR B2.PRODUCTID = A2.ITEM_ID) ) ) )
당신은 RANK를 (사용) 또는 최고 일 등 RANK ()를 시도하거나이 하이브 질문이 아니었다면 ROW_NO 아마 이러한 해킹의 장점을 것입니다,하지만 난 당신이 HQL을 사용하는 알다시피, 나는 쓰기를하지 않을거야 수 그것까지. 조회 테이블을 다시 묶는대로 그를 사용하여 별도의 테이블에 그들을 밖으로 끌어하고 업데이트 할 몇 가지 논리적 업데이트 쿼리를 실행할 수 있습니다.
tbl1Tbl2Lookup --------------- id int identity table1info FK table2info FK
당신이 할 아마해야하는 것은 문제가있는 사람이 당신에 현상금을 제공하는 것입니다 제안 - 당신이 정말로 세 번째 시나리오를 조회 할 수있는 좋은 방법이없고 그들이 당신에게 HIVE에 특정 대안을 제공하기 때문이다.
from https://stackoverflow.com/questions/11386368/sql-query-join-with-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열 이름을 가진 여러 열의 가장 큰 가치인가? (0) | 2020.05.29 |
---|---|
[SQL] 로그온을 생성 - SQL 사용자 이름으로 @parameter 사용할 수 없습니다 (0) | 2020.05.29 |
[SQL] 왜 wm_concat 여기에 작동하지 않는 이유는 무엇입니까? (0) | 2020.05.29 |
[SQL] 부동 소수점으로 값을 캐스팅 할 수 없습니다 (0) | 2020.05.29 |
[SQL] 맞춤법의 차이와 유사한 단어를 인식하는 방법 (0) | 2020.05.29 |