这是Table1
数据。
USER_ID | PRODUCT_ID | TIMESTAMPS
------------+------------------+-------------
1015826235 220003038067 *1004941621*
1015826235 300003861266 1005268799
1015826235 140002997245 1061569397
1015826235 *210002448035* 1005542471
如果您将Table1
数据与以下Table2
数据进行比较,那么PRODUCT_ID
数据最后一行中的Table1
与ITEM_ID
不匹配在以下Table2
数据的最后一行中,TIMESTAMPS
数据的第一行中与Table1
相同的数据与CREATED_TIME
的第一行中的Table2
不匹配1}}数据。
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 *200002448035* 2001-11-11 22:21:11
所以我需要在使用Table2 JOINING Table1之后为上面的例子显示这样的结果 - 以下输出中的任何一个都适合我。
BUYER_ID | ITEM_ID | CREATED_TIME | PRODUCT_ID | TIMESTAMPS
------------+-------------------+-------------------------+-------------------+-----------------
1015826235 220003038067 *2001-11-03 19:40:21* 220003038067 *1004941621*
1015826235 *200002448035* 2001-11-11 22:21:11 *210002448035* 1005542471
或
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | TIMESTAMPS
-----------+-------------------+-------------------------+------------------+----------------------+------------------
1015826235 220003038067 *2001-11-03 19:40:21* 1015826235 220003038067 *1004941621*
1015826235 *200002448035* 2001-11-11 22:21:11 1015826235 *210002448035* 1005542471
任何帮助将不胜感激。
更新: -
select * from (select * 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 LEFT OUTER
JOIN table2 ON ( prod_and_ts.user_id = table2.buyer_id AND table2.item_id =
prod_and_ts.product_id AND prod_and_ts.timestamps = UNIX_TIMESTAMP
(table2.created_time) ) where table2.buyer_id IS NULL) set_a LEFT OUTER JOIN
table2 ON (set_a.user_id = table2.buyer_id AND ( set_a.product_id =
table2.item_id OR set_a.timestamps = UNIX_TIMESTAMP(table2.created_time) ));
答案 0 :(得分:1)
我相信以下内容应该返回一张表,就像你列出的第二张表一样。
SELECT T2.BUYER_ID, T2.ITEM_ID, '*'+T2.CREATED_TIME+'*' as CREATED_TIME, T1.USER_ID, T1.PRODUCT_ID, '*'+T1.TIMESTAMPS+'*' as TIMESTAMPS
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
AND T1.PRODUCT_ID = T2.ITEM_ID
AND T1.TIMESTAMPS <> T2.CREATED_TIME
UNION
SELECT T2.BUYER_ID, '*'+T2.ITEM_ID+'*' as ITEM_ID, T2.CREATED_TIME, T1.USER_ID, '*'+T1.PRODUCT_ID+'*' as PRODUCT_ID, T1.TIMESTAMPS
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
AND T1.TIMESTAMPS = T2.CREATED_TIME
AND T1.PRODUCT_ID <> T2.ITEM_ID
第一个语句获取BUYER_ID和USER_ID匹配的所有行,PRODUCT_ID和ITEM_ID匹配,但TIMESTAMPS和CREATED_TIME不匹配。
第二个获取BUYER_ID和USER_ID匹配的所有行,TIMESTAMPS和CREATED_TIME匹配,但PRODUCT_ID和ITEM_ID不匹配。
如果有人不止一次购买同一种产品,或者有人在同一时间购买了2种不同的产品,那么这当然会很麻烦。
答案 1 :(得分:0)
在我看来,您希望LE_ JOIN加入USER_ID = BUYER_ID,PRODUCT_ID = ITEM_ID,TIME1 = TIME2上的两个表。
有些行将匹配所有三个字段,并在所有三列中生成非空值。你想要的其他人 报告。
然后,您希望以相反的顺序对表运行相同的查询。
因此,您将在第一个表中包含所有不匹配的行,并在第二个表中包含不匹配的行。
SELECT * from table1 LEFT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
WHERE buyer_id IS NULL
UNION
select * from table1 RIGHT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
WHERE product_id IS NULL;
我认为没有办法调和两者;一般来说,你甚至不确定拥有相同的数字 两个查询中的行数。也许你可以在两个不匹配的集合之间运行第二个查询,注意到 共享userid和productid的行,或userid和timestamp。但你也应该跟踪共享的线路吗?
例如,获取非匹配集1并尝试根据产品ID或时间戳将其与table2匹配(两者都不能 匹配,或第一个JOIN匹配,且buyer_id不会为NULL)
SELECT * FROM
( SELECT table1.user_id, table1.product_id, table1.ts1 FROM table1 LEFT JOIN table2
ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2) WHERE buyer_id IS NULL ) AS set_a
LEFT JOIN table2
ON ( set_a.user_id = table2.buyer_id AND
( set_a.product_id = table2.item_id OR set_a.ts1 = table2.ts2 ));
对table1反向运行将以另一种方式获取部分匹配。
如果行的数量始终相同并且与userid匹配,则上面的查询将给出预期结果。除了我在我的例子中定义ts1和ts2作为两个时间戳;时间戳和日期/时间之间的所有比较都需要适当的转换功能,例如
ts1 = ts2
可能会成为
DATETIME(ts1) = ts2
或
ts1 = UNIX_TIMESTAMP(ts2)
等,取决于ts1和ts2以及平台的实际定义(例如,MySQL vs SQL Server vs PostgreSQL ...)。