2013-05-20 5 views
1

У меня есть несколько видов и таблиц, которые я пытаюсь подключить в одном представлении, чтобы создать графический интерфейс для нескольких пользователей (и меня). Это в основном система инвентаризации, которая связывает информацию о покупке, которая была сброшена в таблицу SQL + внутренний тег актива + доступ пользователя. Столы похожи на:SQL Server 2008 R2 просмотр помощи

  • активы - Серийный номер, ID
  • UserAudit - UserName, AssetsID, OfficeID, дата/время
  • Офис - место
  • Заказы - серийный номер, подробно

Некоторые из активов - это компьютеры, а UserAudit заполняется сценарием входа в систему, который записывает имя пользователя, имя компьютера и дату/время. Я пытаюсь создать представление, которое связывает всю информацию, основанную на списке Активы, независимо от того, имеют ли соответствующие таблицы соответствующие данные. Для стороны UserAudit я просто хочу отобразить самую последнюю запись (поле даты Desc).

Место, где я столкнулся с проблемой, захватывает только верхнюю запись из UserAudit на основе ComputerName, все еще возвращая все столбцы из других. Я попытался создать отдельное представление для UserAudit с показом «Top 1» - однако это ограничило основной вид только одним результатом, если я использую «внутреннюю связь» и ничего не отображаю из UserAUdit при использовании любого соединения OUTER ,

Я провел некоторое исследование, в котором приложение Cross Apply выглядит так, как будто оно может быть релевантным, однако я не использовал это раньше, и попытки не сработали. Вид в настоящее время выглядит так:

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 

EDIT

Попробуйте использовать уникальный псевдоним после закрытия скобок:

OUTER APPLY(...) TLA 

, а затем в Select-Part, используйте псевдоним без dbo.

SELECT .., ... , TLA.UserName 

Возможно, это только немного, чтобы добиться этого.

+0

Я пробовал несколько вариантов и продолжаю терпеть неудачу. Если я объявляю столбцы в первом Select, я получаю ошибку «многочастный идентификатор», если я не объявляю их в начальном выборе, он разбирает правильно, но не отображает какие-либо данные. Ниже приведен один из примеров, которые я пробовал: – Talion83

+0

SELECT dbo.vewOffices.Name AS OfficeName, [dbo]. [VewLogonAudit]. [Имя пользователя], dbo.AssetTagInventory.ID FROM dbo.AssetTagInventory INNER JOIN dbo.vewOffices ON dbo.AssetTagInventory.OfficeID = dbo.vewOffices.ID OUTER APPLY (SELECT TOP 1 [DBO]. [vewLogonAudit]. [имя пользователя] ИЗ dbo.vewLogonAudit ГДЕ [DBO]. [AssetTagInventory]. [имя] = [ DBO].[vewLogonAudit]. [Имя_компьютера] ) vewLogonAudit – Talion83

+0

Привет, я внесли изменения в свой ответ. (Вы можете лучше отредактировать исходный вопрос, чтобы добавить новый код, в комментарии не работает). – KekuSemau

Смежные вопросы