使用多个表的相关子查询
Correlated subquery using multiple tables
我在执行某些任务时遇到问题。
我有很多这样的任务:创建一个查询,为每个客户显示他最后一张发票的 ID(姓名、姓氏、最后一张发票的 ID、发票日期)
以下是 table:
Table“客户”:
ClientID
Surname
Name
Pesel
1
ABC
XYZ
01234
etc
etc
etc
etc
Pesel 是波兰人 id
Table“发票”:
InvoiceID
InvoiceDate
ClientID
PaymentMethod
F1/2020
01.01.2020
1
Cash
etc
etc
etc
etc
我必须使用带别名的相关子查询来完成。我知道比较来自单个 table 的记录是如何工作的,但是如何对其中的两个记录进行比较?
我从老师那里得到的例子是这样的:
SELECT a.subject, a.grade, a.data
FROM students_grade AS a
WHERE data = (
SELECT MAX( data )
FROM students_grade AS b
WHERE a.subject = b.subject );
我需要做同样的事情
感谢您的帮助:)
按照您的示例使用 1 和 2 'invoices',然后加入 'clients':
select c.name, c.surname
, i1.InvoiceID as `ID of last invoice`
, i1.InvoiceDate as `invoice date`
from invoices i1
left join clients c on c.ClientID = i1.ClientID
where i1.InvoiceDate = ( select max(i2.InvoiceDate)
from invoices i2
where i2.ClientID = i1.ClientID)
示例数据的 dbfiddle here (MariaDB 10.3)
进行相关子查询的成本可能很高。到 pre-querying 每个客户的 max() 发票日期和加入应该会更好。
select
PQ.ClientID,
c.SurName,
c.Name,
i.InvoiceID,
i.InvoiceDate
from
( select
clientID,
max( InvoiceDate ) MaxDate
from
invoices
group by
clientID ) PQ
JOIN Invoices i
on PQ.ClientID = i.ClientID
AND PQ.MaxDate = i.InvoiceDate
JOIN Client c
on PQ.ClientID = c.ClientID
我在执行某些任务时遇到问题。
我有很多这样的任务:创建一个查询,为每个客户显示他最后一张发票的 ID(姓名、姓氏、最后一张发票的 ID、发票日期)
以下是 table:
Table“客户”:
ClientID | Surname | Name | Pesel |
---|---|---|---|
1 | ABC | XYZ | 01234 |
etc | etc | etc | etc |
Pesel 是波兰人 id
Table“发票”:
InvoiceID | InvoiceDate | ClientID | PaymentMethod |
---|---|---|---|
F1/2020 | 01.01.2020 | 1 | Cash |
etc | etc | etc | etc |
我必须使用带别名的相关子查询来完成。我知道比较来自单个 table 的记录是如何工作的,但是如何对其中的两个记录进行比较?
我从老师那里得到的例子是这样的:
SELECT a.subject, a.grade, a.data
FROM students_grade AS a
WHERE data = (
SELECT MAX( data )
FROM students_grade AS b
WHERE a.subject = b.subject );
我需要做同样的事情
感谢您的帮助:)
按照您的示例使用 1 和 2 'invoices',然后加入 'clients':
select c.name, c.surname
, i1.InvoiceID as `ID of last invoice`
, i1.InvoiceDate as `invoice date`
from invoices i1
left join clients c on c.ClientID = i1.ClientID
where i1.InvoiceDate = ( select max(i2.InvoiceDate)
from invoices i2
where i2.ClientID = i1.ClientID)
示例数据的 dbfiddle here (MariaDB 10.3)
进行相关子查询的成本可能很高。到 pre-querying 每个客户的 max() 发票日期和加入应该会更好。
select
PQ.ClientID,
c.SurName,
c.Name,
i.InvoiceID,
i.InvoiceDate
from
( select
clientID,
max( InvoiceDate ) MaxDate
from
invoices
group by
clientID ) PQ
JOIN Invoices i
on PQ.ClientID = i.ClientID
AND PQ.MaxDate = i.InvoiceDate
JOIN Client c
on PQ.ClientID = c.ClientID