drop table if exists tablea;
create table tablea(id int,catid varchar(6),acca int,accb int,price int);
drop table if exists tableb;
create table tableb(catid varchar(6),name varchar(7),customer varchar(6), dt date);
truncate tablea; truncate tableb;
insert into tablea values
(2,'Order5',111,131,40),(3,'Order1',131,511,40),(4,'Order2',131,511,40),(5,'Order3',111,131,30),(6,'Order3',133,131,10);
insert into tableb values
(1,'Order1','Apple','2016-11-02'),(2,'Order2','Apple','2016-11-11'),(3,'Order3','Apple','2016-11-11'),(4,'Order4','Google','2016-11-11');
在这个解决方案的第一步是创建一个虚拟键(K),并决定是否行是父母或儿童
MariaDB [sandbox]> select a.*,
-> case when a.acca = 131 then 1
-> else 2
-> end as ParentOrChild,
-> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
-> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
-> end as k
-> from tablea a
-> join tableb b on b.name = a.catid;
+------+--------+------+------+-------+---------------+------------------+
| id | catid | acca | accb | price | ParentOrChild | k |
+------+--------+------+------+-------+---------------+------------------+
| 3 | Order1 | 131 | 511 | 40 | 1 | 1312016112Apple |
| 4 | Order2 | 131 | 511 | 40 | 1 | 13120161111Apple |
| 5 | Order3 | 111 | 131 | 30 | 2 | 13120161111Apple |
| 6 | Order3 | 133 | 131 | 10 | 2 | 13120161111Apple |
+------+--------+------+------+-------+---------------+------------------+
4 rows in set (0.00 sec)
下一阶段的工作了,如果孩子总价格匹配父价格
MariaDB [sandbox]> select s.parentorchild, s.k,
-> sum(case when s.parentorchild = 1 then s.price else 0 end) -
-> sum(case when s.parentorchild = 2 then s.price else 0 end) MatchedPrice
-> from
-> (
-> select a.*,
-> case when a.acca = 131 then 1
-> else 2
-> end as ParentOrChild,
-> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
-> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
-> end as k
-> from tablea a
-> join tableb b on b.name = a.catid
->) s
-> group by s.k
-> order by s.k,s.parentorchild;
+---------------+------------------+--------------+
| ParentOrChild | k | MatchedPrice |
+---------------+------------------+--------------+
| 1 | 13120161111Apple | 0 |
| 1 | 1312016112Apple | 40 |
+---------------+------------------+--------------+
2 rows in set (0.00 sec)
我们现在知道了虚拟按键(K),我们感兴趣的是(MatchedPrice = 0),所以如果我们在虚拟键连接回我们得到我们感兴趣的
行
ariaDB [sandbox]> select u.id,u.catid,u.customer,u.dt,u.acca,u.accb,u.price
-> from
-> (
-> select s.parentorchild, s.k,
-> sum(case when s.parentorchild = 1 then s.price else 0 end) -
-> sum(case when s.parentorchild = 2 then s.price else 0 end) MatchedPrice
-> from
-> (
-> select a.*,
-> case when a.acca = 131 then 1
-> else 2
-> end as ParentOrChild,
-> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
-> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
-> end as k
-> from tablea a
-> join tableb b on b.name = a.catid
->) s
-> group by s.k
-> order by s.k,s.parentorchild
->) t
-> join
-> (select a.*, b.customer,b.dt,
-> case when a.acca = 131 then 1
-> else 2
-> end as ParentOrChild,
-> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
-> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
-> end as k
-> from tablea a
-> join tableb b on b.name = a.catid
->) u
-> on u.k = t.k
-> where MatchedPrice = 0
-> ;
+------+--------+----------+------------+------+------+-------+
| id | catid | customer | dt | acca | accb | price |
+------+--------+----------+------------+------+------+-------+
| 4 | Order2 | Apple | 2016-11-11 | 131 | 511 | 40 |
| 5 | Order3 | Apple | 2016-11-11 | 111 | 131 | 30 |
| 6 | Order3 | Apple | 2016-11-11 | 133 | 131 | 10 |
+------+--------+----------+------------+------+------+-------+
3 rows in set (0.00 sec)
请注意,如果您使用工作表而不是试图在单个查询中执行此操作,性能可能会更好。
您能否请您展示您到目前为止所尝试的内容,并找到有用的链接http://www.w3schools.com/sql/sql_join_left.asp – Veerendra
提供您的样本数据和样本预期结果。 – Viki888
分享您的查询和样品表数据 – AftabHafeez