1

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

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

其中一些资产是计算机,并且 UserAudit 由记录用户名、计算机名和日期/时间的登录脚本填充。我正在尝试创建一个视图,该视图根据资产列表链接所有信息,无论它们相关的表是否具有匹配的数据。对于 UserAudit 方面,我只想显示最近的记录(日期字段 Desc)。

我遇到问题的地方是根据 ComputerName 从 UserAudit 中获取最高记录,同时仍从其他列返回所有列。我尝试为 UserAudit 创建一个单独的视图并显示“Top 1” - 但是,如果我使用“内部联接”并且在使用任何外部联接时不显示来自 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
4

1 回答 1

0

看看OUTER APPLY。它应该正是您在这里所需要的。它应该与类似的东西一起工作(在其他加入之间/之后):

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

编辑

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

OUTER APPLY(...) TLA

然后在 Select-Part 中,使用没有的别名dbo.

SELECT .., ... , TLA.UserName

也许这是让它继续前进的唯一一点点。

于 2013-05-20T22:44:28.983 回答