我需要创建一个视图来从两个表中提取数据。
发票
发票
工作
供应商
InvoiceItems
发票
工作
数量
此处的问题是发票表工作字段未填充。所以我需要从InvoiceItems表中获取Job Field。但是,InvoiceItems为每个发票或作业都有多条记录。
我目前使用的视图创建为
**Create view dbo.invoicesjob
as
select i.invoice, max(j.job) as JobNumber
from invoices i left outer join invoiceitems j on i.invoice=j.invoice
group by i.invoice**
这是从invoiceitems表中提取的正确方法吗?
答案 0 :(得分:0)
修改:将分组更改为发票和作业
试试这个
CREATE VIEW dbo.invoicesjob
as
select
i.invoice,
j.job as 'JobNumber'
from invoices i left outer join
(select
invoice,
job
from invoiceitems
group by invoice, job) j
on i.invoice=j.invoice
您可以在下面添加您的Where语句。
where i.status = 'pending'
或者,如果您想采用更加友好的方式:
CREATE VIEW dbo.invoicesjob
as
select
i.invoice,
j.job as 'JobNumber'
from
(select invoice
from invoices
where i.status = 'pending') i
left outer join
(select
invoice,
job
from invoiceitems
group by invoice, job) j
on i.invoice=j.invoice
答案 1 :(得分:0)
看起来不错。我假设invoice
列是invoices
表中的主键或唯一键。否则,GROUP BY操作将折叠行。 (并不是说折叠行有什么问题,这实际上取决于你的要求。)
您的查询将为您提供Invoices
的行以及从JobNumber
获得的invoiceitems
行(如果有的话)。如果invoiceitems
没有可用的匹配行,则查询将为JobNumber
列返回NULL。
在更一般的情况下,当您由于某种原因不想在查询上GROUP BY
时(例如,您不想从invoices
表中删除任何行),您可以在内联视图中为每个invoice
获取一个JobNumber ...
SELECT i.invoice
, j.jobnumber
FROM invoices i
LEFT
JOIN ( SELECT k.invoice
, MAX(k.job) AS jobnumber
FROM invoiceitems k
GROUP BY k.invoice
) j
ON j.invoice = i.invoice
但同样,如果invoice
是invoices
表中的主键或唯一键,那么这将返回与视图定义中的查询等效的结果。没有任何区别。