我有这3个数据表(快速版):
Payments:
id | datepaid | amountpaid
---------------------------
112|03/5/2017 |9000
115|03/21/2017| 800
Individuals:
id|name|lastDatePaid
--------------------
112|bob|03/2/2017
114|kary|2/3/2016
Business:
id|name|lastDatePaid
--------------------
115| Bakery Love | 05/20/2017
我的问题是:如果条件是2017年3月2日或之后的每笔付款,我如何获得商家名称和个人姓名的结果?
我能够在一个条件下获得演出结果,但我似乎不明白让个人和企业都出现?
想要结果:
112|bob
115|Bakery Love
这是我的版本,一个结果显示例如个人:
SELECT DISTINCT p1.id, i1.name
FROM Payments p1, Individuals i1
WHERE p1.datePaid >= DATE '2017-03-01' AND p1.id = i1.id;
此代码的结果仅为:
112|bob
另外我读过一本书,这段代码也是等价的,但我不这么认为?
SELECT DISTINCT p1.id, i1.name
FROM Individuals i1, Payments p1
WHERE i1.id IN (SELECT DISTINCT p1.id
FROM Payments p1
WHERE p1.datePaid >= DATE '2017-03-01');
当我重写它以尝试获得相同的结果时,我最终因某种原因得到了不需要的数据。显然,它检查个人和企业表中的日期(lastDatePaid)并打印,而没有AND条件,它应该是付款的ID。(这是数据的完整版本)。
答案 0 :(得分:0)
您可以采取的一种方法是使用'名称'桌子彼此叠加。
Select * from individuals
Union all
Select * from business
然后,您将其设为子查询并将其加入付款表...
Select p.id, n.name
From
Payments p
Join
( 从个人中选择* 全联盟 选择*来自商业)为n 在n.id = p.id
看起来你已经想出如何让日期过滤器工作,所以我不打算添加它。
答案 1 :(得分:0)
SELECT DISTINCT p1.ID, N.name
FROM Payments p1, (SELECT i1.name, i1.ID
FROM Individuals i1
UNION ALL
SELECT b1.name, b1.ID
FROM Businesses b1) AS N
WHERE p1.datePaid >= DATE '2017-03-01' AND p1.ID = N.ID;