Vergleichen zweier Tabellen mithilfe von SQL-JOIN
Dies ist Table1
Daten.
USER_ID | PRODUCT_ID | TIMESTAMPS
------------+------------------+-------------
1015826235 220003038067 *1004941621*
1015826235 300003861266 1005268799
1015826235 140002997245 1061569397
1015826235 *210002448035* 1005542471
Vergleicht man die Table1
Daten mit der unten Table2
Daten, dann die PRODUCT_ID
in der letzten Zeile Table1
Daten nicht in übereinstimmung mit den ITEM_ID
in der letzten Zeile in der unten Table2
Daten und auch gleich mit TIMESTAMPS
in der ersten Zeile der Table1
Daten nicht in übereinstimmung mit CREATED_TIME
in der ersten Zeile der Table2
Daten.
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
Also muss ich zeigen das Ergebnis, wie dies für das obige Beispiel nach dem EINTRITT in Tabelle1 mit Tabelle2 - Entweder von der unten output ist in Ordnung für mich.
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
ODER
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
Jede Hilfe wird geschätzt.
UPDATE:-
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) ));
- Haben Sie sich nicht schon diese Frage stellst...? SQL-Abfrage-JOIN mit Tabelle
- Ich fragte dann aber, dass ich die Buchung Tabelle1 als eine separate SQL-Abfrage, aber hier habe ich vereinfacht es noch mehr, indem Sie die "Tabelle1" und " Tabelle2 als getrennt, so dass die Leute nicht verwirrt werden.
- Dann würde ich löschen Sie Ihre Vorherige Frage, oder Sie werden riskieren diese Frage geschlossen als exaktes Duplikat.
- Sie können löschen Sie meine Vorherige Frage, wenn Sie wollen. Und halten dies als eine neue, als dieser ist genauer und sauberer zu verstehen, was ich will.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das folgende sollte eine Tabelle zurückgeben, die wie die zweite, die Sie aufgelistet.
Die erste Anweisung ruft alle Zeilen, in denen die BUYER_ID und USER_ID übereinstimmen, wird die PRODUCT_ID und ITEM_ID übereinstimmen, aber der ZEITSTEMPEL und CREATED_TIME NICHT übereinstimmen.
Zweiten erhält alle Zeilen, in denen die BUYER_ID und USER_ID übereinstimmen, werden die ZEITSTEMPEL und CREATED_TIME match, aber die PRODUCT_ID und die ITEM_ID NICHT übereinstimmen.
Diese natürlich könnte chaotisch, wenn jemand kauft das gleiche Produkt mehr als einmal, oder wenn jemand kauft 2 verschiedene Produkte zur exakt gleichen Zeit.
Scheint mir, dass Sie möchten, LEFT JOIN der beiden Tabellen auf USER_ID = BUYER_ID, PRODUCT_ID = ITEM_ID, TIME1 = ZEIT2.
Einige Zeilen, mit allen drei Bereichen und Ertrag nicht-null-Werte in allen drei Spalten. Die andere, die Sie wollen
Bericht.
Dann wollen Sie zum ausführen der gleichen Abfrage mit den Tabellen in umgekehrter Reihenfolge.
Somit werden alle nicht übereinstimmenden Zeilen in der ersten Tabelle, und die übereinstimmenden Zeilen in der zweiten Tabelle.
Ich glaube nicht, dass es einen Weg der Annäherung der beiden; Sie sind nicht einmal sicher, in der Regel, um die gleiche Anzahl
der Zeilen in den beiden Abfragen. Vielleicht können Sie führen Sie eine zweite Abfrage zwischen den beiden nonmatched setzt, zu bemerken,
die Linien teilen userid und productid, oder userid und timestamp. Aber Sie sollten auch die Gleise teilen weder?
Zum Beispiel die übereinstimmenden Satz 1 und versuchen eine übereinstimmung mit Tabelle2, basierend auf Produkt-id oder timestamp (beide nicht
Spiel, oder die ersten BEITRETEN würden verglichen haben, und buyer_id hätte nicht NULL)
Den gleichen running in reverse gegen Tabelle1 Holen würde teilweise übereinstimmungen in der anderen Richtung.
Wenn die Zeilen immer die gleiche Zahl und matched by userid, die obige Abfrage wird die erwarteten Ergebnisse. Außer, dass ich den vorgegebenen ts1 und ts2, in meinem Beispiel, als zwei timestamps; alle Vergleiche zwischen einem timestamp und einem Datum/Uhrzeit-bedürfen-die ordnungsgemäße Konvertierung-Funktion, z.B.
werden könnte
oder
oder dergleichen, je nach der tatsächlichen definition von ts1 und ts2 und die Plattform (z.B., MySQL vs SQL Server vs. PostgreSQL...).
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
So wie pro meine Frage, die ich vertreten, die Ausgabe von der obigen Abfrage als "Tabelle1" Daten. So, wie pro Ihre zweite Abfrage, stellte ich meine Abfrage so wie unten aus und ich habe die Betreuung von timestamp-Konvertierung. Ich aktualisiert meine Frage mit der Abfrage, die ich verwende.OR
im JOIN-Abfrage, also, wenn Sie schauen Sie auf Ihre Letzte Zeile in der zweiten Abfrage haben SieOR
in dieser Zeile im Grunde.( set_a.product_id = table2.item_id OR set_a.ts1 = table2.ts2 ));
. So gibt es einen Weg, um loszuwerden, dieseOR
- Klausel, und wir können einige andere Weg, dann wird diese Abfrage funktioniert wie Charme in Hive-Umgebung. Irgendwelche Vorschläge?