복붙노트

[SQL] SQL 쿼리 테이블에 가입하기

SQL

SQL 쿼리 테이블에 가입하기

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. ==============================

    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. ==============================

    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에 특정 대안을 제공하기 때문이다.

  3. from https://stackoverflow.com/questions/11386368/sql-query-join-with-table by cc-by-sa and MIT license