SQL-запрос JOIN с таблицей

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

Если вы сравните output from the query with the below Table2 data выше, то product_id в last line of above output не совпадает с ITEM_ID в последней строке в данных ниже Table2.

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

Итак, мой вопрос

Найдите все те PRODUCT_ID(ITEM_ID) и TIMESTAMPS(CREATED_TIME), которые не совпадают с Table2 данными, соответствующими конкретному BUYER_ID или USER_ID.

Поэтому мне нужно показать такой результат для приведенного выше примера:

BUYER_ID   |     ITEM_ID       |      CREATED_TIME       |     USER_ID   |       PRODUCT_ID     |   TIMESTAMPS
-----------+-------------------+-------------------------+---------------+------------------+------------------
1015826235     *210002448035*       2001-11-11 22:21:11     1015826235      *200002448035*     1005542471

Мне нужно ПРИСОЕДИНИТЬСЯ к вышеуказанному запросу, который я написал с таблицей 2, чтобы получить вышеуказанный результат. Поэтому мне нужно использовать мой запрос выше в процессе JOINING. Это меня очень смущает. Любое предложение будет оценено.

ОБНОВЛЕНИЕ:-

Я написал приведенный ниже запрос, но почему-то не могу добиться того, чего хотел. Кто-нибудь может мне с этим помочь?

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));

person arsenal    schedule 08.07.2012    source источник
comment
Я работаю с Hive, и Hive поддерживает синтаксис, подобный SQL, поэтому я помечаю этот вопрос как sql и join. Таким образом, JOIN будет работать в HIVE. Мне просто нужно ПРИСОЕДИНИТЬСЯ в основном. Поэтому я думаю, что синтаксис Oracle будет в порядке.   -  person arsenal    schedule 09.07.2012
comment
Почему последняя строка не совпадает? Это из-за того, что временная метка не соответствует созданному времени?   -  person dash    schedule 09.07.2012
comment
Я не уверен, правильный ли фактический запрос, который я написал, или нет. Это меня очень смущает. Так что не уверен, что приведенный выше запрос правильный или нет.   -  person arsenal    schedule 09.07.2012
comment
Ваш запрос выглядит нормально; попробуйте следующее JOIN, заменив все в вашем запросе выше после ) prod_and_ts : LEFT JOIN table2 где prod_and_ts.user_id = table2.buyer_id и product_id = table2.item_id AND timestamps = UNIX_TIMESTAMP(table2.created_time) WHERE table2.item_id IS NULL - это должно выберите все строки, которые НЕ соответствуют пользователю, продукту и отметке времени   -  person dash    schedule 09.07.2012
comment
Я не уверен, правильный ли ваш запрос или нет, поскольку у вас есть два предложения where в упомянутом вами запросе. Вы уверены, что ваш запрос правильный?   -  person arsenal    schedule 09.07.2012
comment
Ваш представитель слишком высок, чтобы открыть дубликат **и особенно 2 дубликата одного и того же вопроса. [stackoverflow.com/q/11336950/1166147][1] [stackoverflow.com/q/ 11428269/1166147][2]   -  person user1166147    schedule 12.07.2012


Ответы (2)


Я думаю, вы можете делать то, что хотите, с двумя запросами, но я не уверен на 100%. Часто в такой ситуации достаточно найти в первой таблице то, что не совпадает во второй таблице. Вы также пытаетесь получить «самое близкое» совпадение, поэтому это сложно.

Следующий запрос ищет совпадения для идентификатора пользователя и ровно одного из двух других полей, а затем объединяет их:

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)

Это не позволит найти ситуации, когда нет совпадения ни в одном из полей.

Кроме того, я написал это, используя синтаксис «on», а не «where». Я предполагаю, что HIVE поддерживает это.

person Gordon Linoff    schedule 11.07.2012

Ваша репутация слишком высока, чтобы открыть дубликат и особенно 2 дубликата одного и того же вопроса.

Объединение двух таблиц в Hive с помощью HiveQL(Hadoop)

Объединить две таблицы и получить результат из обеих

У вас недостаточно информации, чтобы связать записи для третьего сценария.
Вы можете выполнить FULL OUTER JOIN с OR и получить все обратно, сопоставив строки, о которых у вас достаточно информации, как в первом, так и во втором случае. list и определите записи, которые вам не нужны, возвращая строки с нулевыми значениями для полей из несоответствующей таблицы в третьем сценарии.

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() или попробовать top one и т. д. RANK() или ROW_NO, вероятно, были бы лучшими из этих хаков, если бы это не был вопрос Hive, но, поскольку я знаю, что вы используете HQL, я не собираюсь это описывать. Вы можете вытащить их в отдельную таблицу и выполнить несколько логических запросов на обновление, чтобы обновить ее, а затем использовать ее в качестве таблицы поиска для привязки.

 tbl1Tbl2Lookup
 ---------------
 id int identity
 table1info FK
 table2info FK 

Вероятно, вам следует сделать то, что предложил человек в вопросе, за которого вы предложили награду, поскольку у вас действительно нет хорошего способа запросить третий сценарий, и они предложили вам альтернативу, специфичную для HIVE.

person user1166147    schedule 11.07.2012