объединение результатов двух избранных операторов

Я использую T-SQL с ASP.NET и c#, и я довольно плохо знаком с SQL.

Я задавался вопросом, как я мог объединить результаты двух запросов

Query1:

SELECT tableA.Id,  tableA.Name, [tableB].Username AS Owner, [tableB].ImageUrl, [tableB].CompanyImageUrl, COUNT(tableD.UserId) AS NumberOfUsers
 FROM tableD RIGHT OUTER JOIN 
         [tableB] INNER JOIN
         tableA ON [tableB].Id = tableA.Owner ON tableD.tableAId = tableA.Id
 GROUP BY tableA.Name, [tableB].Username, [tableB].ImageUrl, [tableB].CompanyImageUrl

Query2:

 SELECT tableA.Id,  tableA.Name, COUNT([tableC].Id) AS NumberOfPlans
 FROM   [tableC] RIGHT OUTER JOIN
           tableA ON [tableC].tableAId = tableA.Id
 GROUP BY tableA.Id, tableA.Name

Любая справка очень ценилась бы.Заранее спасибо

12
задан RedFilter 13 May 2010 в 12:24
поделиться

3 ответа

Вы можете использовать Союз .

Это вернет результаты запросов в отдельные строки.

Сначала вы должны убедиться, что оба запроса возвращают одинаковые столбцы.

Затем вы можете сделать:

SELECT tableA.Id, tableA.Name, [tableB].Username AS Owner, [tableB].ImageUrl, [tableB].CompanyImageUrl, COUNT(tableD.UserId) AS Number
FROM tableD 
RIGHT OUTER JOIN [tableB] 
INNER JOIN tableA ON [tableB].Id = tableA.Owner ON tableD.tableAId = tableA.Id 
GROUP BY tableA.Name, [tableB].Username, [tableB].ImageUrl, [tableB].CompanyImageUrl

UNION

SELECT tableA.Id, tableA.Name,  '' AS Owner, '' AS ImageUrl, '' AS CompanyImageUrl, COUNT([tableC].Id) AS Number
FROM 
[tableC] 
RIGHT OUTER JOIN tableA ON [tableC].tableAId = tableA.Id GROUP BY tableA.Id, tableA.Name

Как уже упоминалось, оба запроса возвращают совершенно разные данные. Вы, вероятно, захотите сделать это только в том случае, если оба запроса возвращают данные, которые можно считать похожими.

SO

Вы можете использовать Join

, если есть данные, которые используются совместно двумя запросами. Это поместит результаты обоих запросов в одну строку, соединенную идентификатором, что, вероятно, больше того, что вы хотите здесь делать ...

Вы можете сделать:

SELECT tableA.Id, tableA.Name, [tableB].Username AS Owner, [tableB].ImageUrl, [tableB].CompanyImageUrl, COUNT(tableD.UserId) AS NumberOfUsers, query2.NumberOfPlans
FROM tableD 
RIGHT OUTER JOIN [tableB] 
INNER JOIN tableA ON [tableB].Id = tableA.Owner ON tableD.tableAId = tableA.Id 


INNER JOIN 
  (SELECT tableA.Id, COUNT([tableC].Id) AS NumberOfPlans 
   FROM [tableC] 
   RIGHT OUTER JOIN tableA ON [tableC].tableAId = tableA.Id 
   GROUP BY tableA.Id, tableA.Name) AS query2 
ON query2.Id = tableA.Id

GROUP BY tableA.Name, [tableB].Username, [tableB].ImageUrl, [tableB].CompanyImageUrl
28
ответ дан 2 December 2019 в 03:43
поделиться

Хотя можно объединить результаты, я бы не советовал этого делать.

У вас есть два принципиально разных типа запросов, которые возвращают разное количество строк, разное количество столбцов и разные типы данных. Лучше всего оставить как есть - два отдельных запроса.

6
ответ дан 2 December 2019 в 03:43
поделиться

Вероятно, вы используете Microsoft SQL Server, который поддерживает общие табличные выражения (CTE) (см. http://msdn.microsoft.com/en-us/library/ms190766.aspx ), которые очень удобны для оптимизация запросов. Итак, я предлагаю вам мою конструкцию в пользу:

WITH GetNumberOfPlans(Id,NumberOfPlans) AS (
    SELECT tableA.Id, COUNT(tableC.Id)
    FROM tableC
        RIGHT OUTER JOIN tableA ON tableC.tableAId = tableA.Id
    GROUP BY tableA.Id
),GetUserInformation(Id,Name,Owner,ImageUrl,
                     CompanyImageUrl,NumberOfUsers) AS (
    SELECT tableA.Id, tableA.Name, tableB.Username AS Owner, tableB.ImageUrl,
        tableB.CompanyImageUrl,COUNT(tableD.UserId),p.NumberOfPlans
    FROM tableA
        INNER JOIN tableB ON tableB.Id = tableA.Owner
        RIGHT OUTER JOIN tableD ON tableD.tableAId = tableA.Id
    GROUP BY tableA.Name, tableB.Username, tableB.ImageUrl, tableB.CompanyImageUrl
)
SELECT u.Id,u.Name,u.Owner,u.ImageUrl,u.CompanyImageUrl
    ,u.NumberOfUsers,p.NumberOfPlans
FROM GetUserInformation AS u
    INNER JOIN GetNumberOfPlans AS p ON p.Id=u.Id

После некоторого опыта работы с CTE вы обнаружите, что писать код с использованием CTE очень легко, и вы останетесь довольны производительностью.

6
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: