2016-12-18 6 views
-1

첫 번째 CTE의 모든 행과 두 번째 CTE의 4 개의 행을 선택하는 여러 CTE가 포함 된 쿼리를 작성합니다. 파트를 선택했지만 CTE2에서 전체 항목을 반환합니다. 여러 CTE에서 두 번째 CTE에서 상위 n 개의 행을 선택하는 방법

;WITH CTE1(UserName, ItemId, ItemName, ImageId, ImageName) AS 
    (
     SELECT [Users].UserName, [Items].ItemId, [Items].Name, [Images].ImageId, [Images].Name 
      FROM Items INNER JOIN Images 
       ON [Items].ItemId = [Images].ItemId INNER JOIN Users 
        ON [Items].UserId = TestUser.UserId 
     WHERE ([Items].ItemId = 1) AND ([Items].UserId = 1) AND ([Items].Name = N'Pen') 
    ), 
CTE2(ItemId, ItemName, ImageId, ImageName) AS 
    (
     SELECT [Items].ItemId, [Items].Name, [Images].ImageId, [Images].Name 
      FROM Items INNER JOIN [Images] 
       ON [Items].ItemId = [Images].ItemId 
      WHERE [Items].UserId = 1 
     GROUP BY [Items].ItemId, [Items].Name, [Images].ImageId, [Images].Name 
    ) 
SELECT CTE1.UserName, CTE1.ItemId AS ItemId1, CTE1.ItemName AS ItemName1, 
    CTE1.ImageId AS ImageId1, CTE1.ImageName AS ImageName1, COUNT(CTE1.ItemId) OVER() AS ItemCounter1, 
     CTE2.ItemId AS ItemId2, CTE2.ItemName AS ItemName2, CTE2.ImageId AS ImageId2, CTE2.ImageName AS ImageName2, COUNT(CTE2.ItemId) OVER() AS TotalCount 
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY ItemId) AS RN FROM CTE2) CTE2 LEFT JOIN CTE1 
    ON CTE2.ItemId = CTE1.ItemId WHERE RN = 1 ORDER BY CTE1ItemId DESC
모든 이해 될 수 있습니다 :

this is what it returns and selected part that i want.

내 쿼리입니다.

+2

무엇을 기준으로 4 행을 선택합니까? –

+0

도와 줘서 고마워, 친구. 이제 나는 내 잘못이 어디에 있는지 알았다. – Masoud

답변

0

난 당신이 원하는 것을 정확히 모르거나하는 네 개의 행,하지만 TOP 4은 마음에 온다 :

WITH CTE1(UserName, ItemId, ItemName, ImageId, ImageName) AS (
     SELECT TOP 4 [Users].UserName, [Items].ItemId, [Items].Name, [Images].ImageId, [Images].Name 
     FROM Items INNER JOIN 
      Images 
      ON [Items].ItemId = [Images].ItemId INNER JOIN 
      Users 
      ON [Items].UserId = TestUser.UserId 
     WHERE ([Items].ItemId = 1) AND ([Items].UserId = 1) AND ([Items].Name = N'Pen') 
    ), 
    . . . 

일반적으로 4 개의 가장 최근의 네 오래된, 네 개의 가장 빨간를 선택할 수있는 ORDER BY이있을 것 , 또는 무엇이든.

+0

고마워요, 제 친구. 나는 내 잘못을 깨닫는다. – Masoud

0

도움 주셔서 감사합니다.

다시 내 쿼리를 작성하고 내 잘못이 무엇인지 알아보십시오. 나는 그것이 일상적인 것이 아니라는 것을 알고 있지만, 나는이 문제를 가지고있는 다른 사람들과 내 질문을 공유하기를 원한다.

이 내가 쓰는 것입니다 :

 

    WITH CTE1(ItemId, ItemName, Category, UserId, Created, ImageId, ImageName) AS 
    (
    SELECT [Items].ItemId, [Items].Name, [Items].CategoryId, [Items].UserId, [Items].Created, [Images].ImageId, [Images].Name 
     FROM [Items] INNER JOIN [Images] 
    ON [Items].ItemId = [Images].ItemId 
    WHERE ([Items].UserId = 1) AND ([Items].ItemId = 1) AND ([Items].Name = N'Kolah') 
    GROUP BY [Items].ItemId, [Items].Name, [Items].CategoryId, [Items].UserId, [Items].Created, [Images].ImageId, [Images].Name 
    ), 
    CTE2(ItemId, ItemName, Category, UserId, Created, ImageId, ImageName) AS 
    (
    SELECT [Items].ItemId, [Items].Name, [Items].CategoryId, [Items].UserId, [Items].Created, [Images].ImageId, [Images].Name 
     FROM [Items] INNER JOIN [Images] 
    ON [Items].ItemId = [Images].ItemId 
    WHERE ([Items].UserId = 1) 
    GROUP BY [Items].ItemId, [Items].Name, [Items].CategoryId, [Items].UserId, [Items].Created, [Images].ImageId, [Images].Name 
    ) 
    SELECT TOP 4 CTE2.ItemId, CTE2.ItemName, CTE2.Category, CTE2.UserId, CTE2.Created, CTE2.ImageId, CTE2.ImageName 
     FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY ItemId) AS RN FROM CTE2) CTE2 
    WHERE RN = 1 
     UNION 
    SELECT CTE1.ItemId, CTE1.ItemName, CTE1.Category, CTE1.UserId, CTE1.Created, CTE1.ImageId, CTE1.ImageName 
     FROM CTE1 
    ORDER BY ItemId DESC 

가 대단히 감사합니다.