2013-05-20 3 views
1

여러보기와 테이블을 여러 사용자 (및 나 자신)가 사용할 웹 사이트 GUI를 만들기 위해 하나의보기에서 연결하려고합니다. 이것은 기본적으로 SQL 테이블 + 내부 자산 태그 + 사용자 액세스에 덤핑 된 구매 정보를 함께 연결하는 인벤토리 시스템입니다. 테이블은 유사에 :SQL Server 2008 R2보기 지원

  • 자산 - 일련 번호, ID
  • UserAudit - 사용자 이름, AssetsID, OfficeID, 날짜/시간
  • 사무실 - 위치
  • 주문 - 일련 번호, 세부

여러 자산이 컴퓨터이고 UserAudit은 사용자 이름, 컴퓨터 이름 및 날짜/시간을 기록하는 로그온 스크립트로 채워집니다. 관련 테이블에 일치하는 데이터가 있는지 여부에 관계없이 자산 목록을 기반으로 모든 정보를 연결하는보기를 만들려고합니다. UserAudit 측에서 가장 최근의 레코드 (날짜 필드 Desc) 만 표시하려고합니다.

내가 겪고있는 문제는 다른 컴퓨터의 모든 열을 여전히 반환하는 동안 ComputerName에 기반한 UserAudit의 최상위 레코드를 가져 오는 것입니다. 난 '상위 1'표시 UserAudit 별도의보기를 만들려고 -하지만 "내부 조인"을 사용하여 모든 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 

과의 이 (다른 조인 중/후)과 같이 작동한다 선택 부분은없이 별칭을 사용하십시오

SELECT .., ... , TLA.UserName 

어쩌면 그것이 그걸 얻는 유일한 방법 일 것입니다.

+0

여러 변형을 시도했지만 계속 실패하고 있습니다. 첫 번째 선택에서 열을 선언하면 "다중 부품 식별자"오류가 발생합니다. 초기 선택에서이를 선언하지 않으면 올바르게 파싱되지만 데이터는 표시되지 않습니다. 다음은 시도한 예제 중 하나입니다. – 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 [. AssetTagInventory]. dbo.vewLogonAudit [DBO]에서. vewLogonAudit]. 은 (TOP 1 DBO]를 선택 을 [아이디] 적용 [이름] = dbo].[vewLogonAudit]. [ComputerName] ) vewLogonAudit – Talion83

+0

안녕하세요, 내 대답을 수정했습니다. (원래 질문을 편집하여 새 코드를 추가하는 것이 가장 좋으며, 주석이 잘 작동하지 않습니다.) – KekuSemau