对于每个相同的日期(这只是表格的一个部分),我想要返回购买A但不购买B的帐号,以及另一个查询,反之亦然。所以运行A的第一个查询但没有B应该返回2和5.运行反之亦然查询B但没有A应该给我4.感谢您的帮助。我假设我不得不在桌子上加入一些但是我被卡住了。
+----+----------------+---------------+----------+--+--+
| ID | Account Number | Purchase Type | Date | | |
+----+----------------+---------------+----------+--+--+
| 1 | 1 | A | 20140301 | | |
| 1 | 1 | A | 20140301 | | |
| 1 | 1 | B | 20140301 | | |
| 2 | 2 | A | 20140301 | | |
| 3 | 3 | A | 20140301 | | |
| 3 | 3 | B | 20140301 | | |
| 4 | 4 | B | 20140301 | | |
| 5 | 5 | A | 20140301 | | |
| 5 | 5 | A | 20140301 | | |
+----+----------------+---------------+----------+--+--+
答案 0 :(得分:1)
不确定它是否一定是最佳方法,但内部select
将起作用:
select distinct account_number
from purchases p
where purchase_type = "A" and account_number not in
(
select account_number
from purchases
where purchase_date = p.purchase_date and purchase_type = "B"
)
您首先收集购买类型为“B”的所有ID,然后收集购买类型为“A”且不在第一个集合中的所有ID。
(假设您的表格为purchases
,ID
为id int
,Purchase Date
为purchase_date char(1)
且Date
为purchase_date char(8)
,但是您应该能够使查询适应您的实际列。
答案 1 :(得分:1)
您可以在同一张桌子上使用Exists
:
select distinct AccountNumber , Date
from table1 outer_table
where PurchaseType = 'A' and not exists
(
select ID
from table1 inner_table
where
PurchaseType = 'B'
and inner_table.Date = outer_table.Date
and inner_table.AccountNumber = outer_table.AccountNumber
)
答案 2 :(得分:1)
mov $str, %rdi
小提琴:here
并将两个请求合二为一:
select id,sum(if(purchase_type='A',1,0)) as sumA,sum(if(purchase_type='B',1,0)) as sumB
from purchases
group by id
having sumA>0 and sumB=0
答案 3 :(得分:1)
一种方法是使用完全外连接,其中一方或另一方为空;但mySQL不支持它们。所以要模拟:使用左连接然后是一个联合(或者如果你想保持1,1,A存在两次这一事实的联合所有。)我们只需在第二个SQL的连接之间切换标准就可以处理联合两种方式。
DEMO在评论中使用SQL小提琴:http://sqlfiddle.com/#!9/52c893/20/0
WHERE
答案 4 :(得分:0)
SELECT GROUP_CONCAT( DISTINCT A.account SEPARATOR ', ') AS "accounts"
FROM test A, test B
WHERE A.type='A'
AND A.id=B.id
AND A.date=B.date
AND A.date='2014-03-01'
答案 5 :(得分:0)
你在这里搞砸了,因为MySQL的设定算术运算不完整。它有UNION
和INTERSECT
但不是EXCEPT
。如果它有EXCEPT
你可以做
SELECT DISTINCT `Account Number` FROM purch WHERE `Purchase Type` = 'A'
EXCEPT /* MySQL fail! */
SELECT DISTINCT `Account Number` FROM purch WHERE `Purchase Type` = 'B'
你的问题就会解决。
因此,您可以使用LEFT JOIN ... IS NULL
查询模式。它更冗长但工作正常。 (http://sqlfiddle.com/#!9/52c893/18/0)
SELECT suba.`Account Number`
FROM (
SELECT DISTINCT `Account Number`
FROM purch
WHERE `Purchase Type` = 'A'
) suba
LEFT JOIN (
SELECT DISTINCT `Account Number`
FROM purch
WHERE `Purchase Type` = 'B'
) subb ON suba.`Account Number` = subb.`Account Number`
WHERE subb.`Account Number` IS NULL