2013-05-20 103 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