2013-05-20 74 views
1

我有几个视图和表格,我试图在一个视图中连接,为几个用户(和我自己)创建一个网站GUI以供使用。它基本上是一个库存系统,它将已被转储到SQL表+内部资产标签+用户访问的购买信息链接在一起。表类似于:SQL Server 2008 R2查看帮助

  • 资产 - 序列号,ID
  • UserAudit - 用户名,AssetsID,OfficeID,日期/时间
  • 办公室 - 位置
  • 订单 - 序列号,详细

一些资产是计算机,UserAudit由登录脚本填充,该脚本记录用户名,计算机名称和日期/时间。我试图创建一个链接基于资产列表的所有信息的视图,而不管他们的相关表是否具有匹配的数据。对于UserAudit方面,我只想显示最近的记录(日期字段说明)。

我遇到问题的地方是抓取基于ComputerName的UserAudit的最高记录,同时仍然返回其他所有列。我试图为UserAudit创建一个单独的视图并显示'Top 1' - 但是,如果我使用“Inner Join”,并且在使用任何OUTER联接时不显示UserAUdit中的任何内容,则将主视图限制为只有1个结果。

我做了一些研究,其中一个交叉应用看起来可能是相关的,但是我之前没有使用过它,并且尝试不能很好地工作。该视图目前看起来像:

SELECT TOP (100) PERCENT 
    dbo.AssetType.AssetType, dbo.AssetTagInventory.ID, dbo.AssetTagInventory.AssetDetail, 
    dbo.AssetTagInventory.Name, dbo.AssetTagInventory.Serial, dbo.AssetTagInventory.UserID, 
    dbo.AssetTagInventory.Age, dbo.AssetTagInventory.Notes, 
    dbo.vewOffices.Name AS OfficeName, 
    dbo.AssetTagPurchases.PurchaseDate, dbo.AssetTagPurchases.ProductDescription AS Model, 
    dbo.AssetTagPurchases.ID AS AECOrderNumber, 
    dbo.AssetTagPurchases.Vendor, dbo.AssetTagPurchases.QuotedPrice, 
    dbo.AssetTagPurchases.InvoicedPrice, dbo.AssetTagPurchases.InvoiceNum, 
    dbo.AssetTagPurchases.VendorOrderNumber, dbo.vewLogonAudit.Username, 
    dbo.vewLogonAudit.LoginTime 
FROM 
    dbo.AssetTagInventory 
INNER JOIN 
    dbo.vewLogonAudit ON dbo.AssetTagInventory.Name = dbo.vewLogonAudit.ComputerName 
LEFT OUTER JOIN 
    dbo.AssetType ON dbo.AssetTagInventory.AssetTypeID = dbo.AssetType.ID 
LEFT OUTER JOIN 
    dbo.vewOffices ON dbo.AssetTagInventory.OfficeID = dbo.vewOffices.ID 
LEFT OUTER JOIN 
    dbo.AssetTagPurchases ON dbo.AssetTagInventory.Serial = dbo.AssetTagPurchases.Serial 
+0

使用嵌套子查询仅选择前1个UserAudit记录并加入到该记录中。另外,在行末写上你的连接关键字,而不是开始,这使得阅读你的查询非常令人厌恶。 –

回答

0

看看OUTER APPLY。它应该是你在这里需要的。

OUTER APPLY 
    ( SELECT TOP 1 <columns> 
     FROM dbo.UserAudit 
     WHERE  dbo.AssetTagInventory.<??> = dbo.UserAudit.<??> 
     ORDER BY <...> 
    ) T_UserAudit 

编辑

尝试使用右括号后唯一的别名:

OUTER APPLY(...) TLA 

然后在 它应该像(其它联接中/后)工作选择部分,使用别名dbo.

SELECT .., ... , TLA.UserName 

也许这是唯一的一点点去实现它。

+0

我尝试了多种变化,并保持失败。如果我在第一个选择中声明列,我会得到一个“多部分标识符”错误,如果我没有在初始选择中声明它们,它会正确解析出来,但不会显示任何数据。下面是我尝试过的一个例子: – Talion83

+0

SELECT dbo.vewOffices.Name AS OfficeName,[dbo]。[vewLogonAudit]。[Username],dbo.AssetTagInventory.ID FROM dbo.AssetTagInventory INNER JOIN dbo.vewOffices ON dbo.AssetTagInventory.OfficeID = dbo.vewOffices.ID OUTER APPLY (SELECT TOP 1 [DBO]。[vewLogonAudit]。[用户名] FROM dbo.vewLogonAudit WHERE [DBO]。[AssetTagInventory]。[名称] = [ DBO]。[vewLogonAudit]。[ComputerName] )vewLogonAudit – Talion83

+0

嗨,我已经编辑了我的答案。 (您可以最好地编辑您的原始问题以添加新代码,但在评论中不起作用。) – KekuSemau