从两个表创建视图

时间:2014-03-07 23:34:21

标签: sql sql-server sql-server-2008

我需要创建一个视图来从两个表中提取数据。

发票

发票

工作

供应商

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表中提取的正确方法吗?

2 个答案:

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

但同样,如果invoiceinvoices表中的主键或唯一键,那么这将返回与视图定义中的查询等效的结果。没有任何区别。