采取一个条件&显示两个不同表格的结果

时间:2018-02-07 09:32:52

标签: sql postgresql

我有这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。(这是数据的完整版本)。

2 个答案:

答案 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)

呃,我明白了。 我不需要使用JOIN语句而不是

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;