这个问题在这里已经有了答案:
8年前关闭。
如果这是TestingTable1中的数据
BUYER_ID | ITEM_ID | CREATED_TIME
----------+-----------------+----------------------
1345653 151851771618 2012-07-09 19:57:33
1345653 110909316904 2012-07-09 21:29:06
1345653 221065796761 2012-07-09 19:31:48
如果这是 TestingTable2 中的以下数据
USER_ID | PRODUCT_ID | LAST_TIME
---------+----------------+-----------------------
1345653 150851771618 2012-07-09 19:57:33
1345653 110909316904 2012-07-09 22:29:06
1345653 221165796761 2012-07-09 12:31:48
我需要在
TestingTable2
和 TestingTable1
上比较 BUYER_ID
和 USER_ID
。我需要看看,如果 BUYER_ID
和 USER_ID
匹配,那么我需要将 ITEM_ID
与 PRODUCT_ID
和 CREATED_TIME
与 LAST_TIME
进行比较,如果在与其中一个或两个中的 TestingTable2
比较后 TestingTable1
不匹配,那么我需要显示结果。所以如果你看上面的例子 - 我基本上有三个场景
TestingTable1
中,在第一行中 ITEM_ID
与 PRODUCT_ID
第一行中的 TestingTable2
不匹配,但 CREATED_TIME
与 LAST_TIME
匹配TestingTable1
中,在第二行 CREATED_TIME
与 LAST_TIME
的第二行中的 TestingTable2
不匹配,但 ITEM_ID
与两个表中第二行的 PRODUCT_ID
匹配 TestingTable1
中,在第三行 ITEM_ID
与 PRODUCT_ID
不匹配,而且 CREATED_TIME
与 LAST_TIME
不匹配,因此在第三行中,它们与 TestingTable1
第三行不匹配。 所以这是我在比较
TestingTable2
和 TestingTable1
时需要涵盖的三种情况。而TestingTable1
是MAIN表,总是需要通过它进行比较,所以TestingTable1
中的数据总是准确的。因此,考虑到上面的示例,如果不匹配其中一个或两个,我需要显示这样的结果-
TestingTable1
数据然后在相同的 TestingTable2
数据旁边,以便我可以看到与 TestingTable1
相比,TestingTable2
中有什么值BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | LAST_TIME
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653 151851771618 2012-07-09 19:57:33 1345653 150851771618 2012-07-09 19:57:33
1345653 110909316904 2012-07-09 21:29:06 1345653 110909316904 2012-07-09 22:29:06
1345653 221065796761 2012-07-09 19:31:48 1345653 221165796761 2012-07-09 12:31:48
所以我写了一个查询,我认为它会涵盖我所有的三个场景,但只有它涵盖
First Two
而不是 Third One
。我很困惑我们是否可以实现这第三种情况?SELECT *
FROM(
SELECT *
FROM TestingTable1 A
JOIN TestingTable2 B ON A.BUYER_ID = B.USER_ID AND B.LAST_TIME = A.Created_TIME
WHERE B.PRODUCTID <> A.ITEM_ID
UNION ALL
SELECT *
FROM TestingTable1 A
INNER JOIN TestingTable2 B ON A.BUYER_ID = B.USER_ID AND B.PRODUCTID = A.ITEM_ID
WHERE B.t1time <> A.Created_TIME
) X
任何建议将不胜感激。
更新:-
只是快速更新我最初想做的事情。因为我知道我的第三种情况很少有问题。
首先,在
TestingTable1
中,我正在按 BUYER_ID
和 CREATED_TIME
对表进行排序(ORDER BY),并且与 TestingTable2
相同我正在使用 USER_ID
和 LAST_TIME
进行排序,并且我正在通过确保数据在给定日期属于 BUYER_ID
和 USER_ID
来进行比较。 最佳答案
with C as
(
select *
from TestingTable1 A
inner join TestingTable2 B
on A.BUYER_ID = B.USER_ID and
B.LAST_TIME = A.Created_TIME and
B.PRODUCT_ID <> A.ITEM_ID
union all
select *
from TestingTable1 A
inner join TestingTable2 B
on A.BUYER_ID = B.USER_ID and
B.PRODUCT_ID = A.ITEM_ID and
B.LAST_TIME <> A.CREATED_TIME
)
select *
from C
union all
select *
from TestingTable1 A
inner join TestingTable2 B
on A.BUYER_ID = B.USER_ID and
A.CREATED_TIME <> B.LAST_TIME and
A.ITEM_ID <> B.PRODUCT_ID
where not exists (select *
from C
where A.BUYER_ID = C.BUYER_ID and
A.ITEM_ID = C.ITEM_ID and
A.CREATED_TIME = C.CREATED_TIME) and
not exists (select *
from C
where B.USER_ID = C.USER_ID and
B.PRODUCT_ID = C.PRODUCT_ID and
B.LAST_TIME = C.LAST_TIME);
SQL Fiddle
关于sql - 连接两个表并从它们中获取输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11428269/