Объединение двух SQL-запросов в SQL Server - PullRequest
1 голос
/ 31 марта 2012

У меня проблема с получением запросов SQL в один, проблема в том, что я хочу FirstName, LastName дважды. Сначала имена из tblUploadedImages, а затем имена из tblImageParticipants

ALTER PROCEDURE GetFeaturedImages
AS
BEGIN
   SELECT 
       tblUser.FirstName AS FirstNameUploader, 
       tblUser.LastName AS LastNameUploader, 
       tblUser.UserID AS UserIDUploader 
   FROM 
       tblUploadedImages 
   INNER JOIN 
       tblUser ON tblUploadedImages.UserID = tblUser.UserID

   SELECT        
        tblUploadedImages.ImgUrl, 
        tblUploadedImages.ImgUrlOriginal, 
        tblUploadedImages.Description, 
        tblUploadedImages.ImageID, 
        tblUser.FirstName, 
        tblUser.LastName, 
        tblUploadedImages.UserID AS Uploader, 
        tblImageParticipants.UserID AS Participants
   FROM            
        tblImageParticipants  
   INNER JOIN
        tblUploadedImages ON tblImageParticipants.ImageID = tblUploadedImages.ImageID
   INNER JOIN
        tblUser ON tblImageParticipants.UserID = tblUser.UserID
   ORDER BY 
        tblUploadedImages.Added
END

Я получаю правильные результаты, просто хочу, чтобы это было одним SQL-запросом. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Я думаю, что вы ищете UNION ALL. A UNION удаляет дубликаты. Я думаю, что вы хотите не удалять дубликаты.

SELECT 
   tblUser.FirstName AS FirstNameUploader, 
   tblUser.LastName AS LastNameUploader, 
   tblUser.UserID AS UserIDUploader 
FROM 
   tblUploadedImages 
INNER JOIN 
   tblUser ON tblUploadedImages.UserID = tblUser.UserID

UNION ALL

SELECT        
    tblUser.FirstName, 
    tblUser.LastName, 
    tblUploadedImages.UserID AS Uploader
FROM            
    tblImageParticipants  
INNER JOIN
    tblUploadedImages ON tblImageParticipants.ImageID = tblUploadedImages.ImageID
INNER JOIN
    tblUser ON tblImageParticipants.UserID = tblUser.UserID
ORDER BY 
    tblUploadedImages.Added

Это также может быть богиня , чтобы иметь что-то, чтобы вы знали, что есть что. Вы можете добавить дополнительный столбец для этого, как это:

SELECT 
   tblUser.FirstName AS FirstNameUploader, 
   tblUser.LastName AS LastNameUploader, 
   tblUser.UserID AS UserIDUploader,
   'UploadedImages' AS Type
FROM 
   tblUploadedImages 
INNER JOIN 
   tblUser ON tblUploadedImages.UserID = tblUser.UserID

UNION ALL

SELECT        
    tblUser.FirstName, 
    tblUser.LastName, 
    tblUploadedImages.UserID AS Uploader,
    'ImageParticipants' AS Type
FROM            
    tblImageParticipants  
INNER JOIN
    tblUploadedImages ON tblImageParticipants.ImageID = tblUploadedImages.ImageID
INNER JOIN
    tblUser ON tblImageParticipants.UserID = tblUser.UserID
ORDER BY 
    tblUploadedImages.Added

Надеюсь, это поможет

1 голос
/ 31 марта 2012

Вы можете объединить два запроса с UNION, но столбцы должны совпадать (количество столбцов и их типы).

Таким образом, ваш запрос должен выглядеть следующим образом:

SELECT 
   tblUser.FirstName AS FirstNameUploader, 
   tblUser.LastName AS LastNameUploader, 
   tblUser.UserID AS UserIDUploader 
FROM 
   tblUploadedImages 
INNER JOIN 
   tblUser ON tblUploadedImages.UserID = tblUser.UserID

UNION

SELECT        
    tblUser.FirstName, 
    tblUser.LastName, 
    tblUploadedImages.UserID AS Uploader
FROM            
    tblImageParticipants  
INNER JOIN
    tblUploadedImages ON tblImageParticipants.ImageID = tblUploadedImages.ImageID
INNER JOIN
    tblUser ON tblImageParticipants.UserID = tblUser.UserID
ORDER BY 
    tblUploadedImages.Added

Я исключил дополнительные столбцы из второго запроса, чтобы оба запроса имели одинаковое количество столбцов.

Если вам нужны также дополнительные столбцы из второго запроса, вы можете оставить второй запрос какэто так, но добавьте «фиктивные» столбцы к первому запросу:

SELECT 
   '' as ImgUrl,
   '' as ImgUrlOriginal,
   '' as Description,
   0 as ImageID,
   tblUser.FirstName AS FirstNameUploader, 
   tblUser.LastName AS LastNameUploader, 
   tblUser.UserID AS UserIDUploader,
   0 as Participants
FROM 
   tblUploadedImages 
INNER JOIN 
   tblUser ON tblUploadedImages.UserID = tblUser.UserID

(SQL Server использует имена столбцов из первого запроса, следовательно, псевдонимы)

0 голосов
/ 31 марта 2012

Вы можете сделать LEFT OUTER JOIN для таблицы tblUploadedImages во втором запросе, например так:

SELECT        
        tblUploadedImages.ImgUrl, 
        tblUploadedImages.ImgUrlOriginal, 
        tblUploadedImages.Description, 
        tblUploadedImages.ImageID, 
        tblUser.FirstName, 
        tblUser.LastName, 
        tblUploadedImages.UserID AS Uploader, 
        tblImageParticipants.UserID AS Participants,
        u.FirstName AS FirstNameUploader,
        u.LastName AS LastNameUploader
   FROM            
        tblImageParticipants  
   INNER JOIN
        tblUploadedImages ON tblImageParticipants.ImageID = tblUploadedImages.ImageID
   INNER JOIN
        tblUser ON tblImageParticipants.UserID = tblUser.UserID
   LEFT OUTER JOIN
        tblUploadedImages i ON i.UserID = tblUser.UserID
   LEFT OUTER JOIN
        tblUser u ON u.UserID = i.UserID
   ORDER BY 
        tblUploadedImages.Added

Возможно, вам придется назначить другим таблицам псевдоним, чтобы избежать неоднозначности, но вы можетепопробуйте без первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...