объединение результатов двух утверждений - PullRequest
10 голосов
/ 13 мая 2010

Я использую 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: 1012 *
*

 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

Любая помощь будет высоко ценится. Заранее спасибо

Ответы [ 3 ]

27 голосов
/ 13 мая 2010

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

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

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

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

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
6 голосов
/ 13 мая 2010

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

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

5 голосов
/ 13 мая 2010

Возможно, вы используете Microsoft SQL Server, который поддерживает Common Table Expressions (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, и вы будете довольны производительностью.

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