我有两张桌子
账户:
+------------+--------+
| accountsid | name |
+------------+--------+
| 1 | Bob |
| 2 | Rachel |
| 3 | Mark |
+------------+--------+
销售订单
+--------------+------------+------------+--------+
| salesorderid | accountsid | so_date | amount |
+--------------+------------+------------+--------+
| 1 | 1 | 2015-12-16 | 50 |
| 2 | 1 | 2016-01-13 | 20 |
| 3 | 2 | 2015-12-14 | 10 |
| 4 | 3 | 2016-02-14 | 35 |
+--------------+------------+------------+--------+
正如您所看到的,是1-N关系,其中Accounts有许多Salesorders,Salesorder有1个帐户。
我需要检索不再有效的“旧”帐户。例如,如果某个帐户在2016年没有销售订单是非活动帐户。
因此,在这个例子中,结果只是Rachel。
我该如何检索?我认为它是两者之间的“对立面”,但我不知道该怎么做......
感谢。
PS。尽管有标题我可以在没有INNER JOIN的情况下得到这个。
答案 0 :(得分:1)
您希望实现反连接,在MySQL中有三种可能性:
使用NOT IN
:
SELECT a.*
FROM Accounts a
WHERE a.accountsid NOT IN (
SELECT so.accountsid
FROM `Sales Orders` so
WHERE so.so_date >= '2016-01-01'
)
使用NOT EXISTS
:
SELECT a.*
FROM Accounts a
WHERE NOT EXISTS (
SELECT *
FROM `Sales Orders` so
WHERE so.accountsid = a.accountsid
AND so.so_date >= '2016-01-01'
)
使用外部JOIN
:
SELECT a.*
FROM Accounts a LEFT JOIN `Sales Orders` so
ON so.accountsid = a.accountsid
AND so.so_date >= '2016-01-01'
WHERE so.accountsid IS NULL
答案 1 :(得分:0)
为什么你只需要使用内连接?内连接适用于在两个表上进行数据匹配的情况,但在这种情况下,您不需要使用带有"而不是"的子查询。或"不存在"
答案 2 :(得分:0)
你想要的是获得没有订单的ID,所以得到订单的ID,其余的是没有订单的。
应该是这样的SELECT * FROM Accounts WHERE accountsid NOT IN (SELECT accountsid FROM Sales Orders WHERE so_date > your_date)