SQL Server: объединение - PullRequest
       4

SQL Server: объединение

0 голосов
/ 05 августа 2009

Первые два столбца относятся к одному набору операторов запросов, а остальные - к другому набору. Я хочу отобразить значения в одной строке. Кто-нибудь может мне помочь

A      B      C      D

NULL   NULL   0      22

0      699    NULL   NULL

Оператор SELECT:

SELECT P.A, P.B, T2.C, T2.D 
FROM Table1 AS P 
JOIN (
    SELECT MAX(ID) ID, COUNT(ID) AS A 
    FROM Table1 
    WHERE Type = 0 
    GROUP BY Type) AS A1 
  ON A1.ParcelID = P.ID 
RIGHT OUTER JOIN (
    SELECT MAX(ID) ID, COUNT(ID) AS B 
    FROM Table1 
    WHERE Type = 1 GROUP BY Type) AS B1 
  ON B1.ID = P.ID 
FULL JOIN (
    SELECT R.ID,ISNULL(C1.C,0) C, ISNULL(D1.D,0) D 
    FROM Table2 AS R 
    FULL JOIN (
        SELECT MAX(ID) ID, COUNT(ID) AS C 
        FROM Table2 
        WHERE Type = 0 
        GROUP BY Type) AS C1 
      ON C1.ID = R.ID 
    RIGHT OUTER JOIN (
        SELECT MAX(ID) ID, COUNT(ID) AS D 
        FROM Table2 
        WHERE Type = 1 
        GROUP BY Type) AS D1 
      ON D1.ID = R.ID) AS T2 
  ON T2.ID = P.ID

Ответы [ 3 ]

1 голос
/ 05 августа 2009

Вы можете сделать это с помощью UNION ALL. Просто используйте ваши таблицы вместо @TableVariables, которые я объявил в приведенном ниже примере.

SET NOCOUNT ON

DECLARE @Temp1 TABLE 
(
    DataColumn1 VarChar (100),
    DataColumn2 VarChar (100),
    DataColumn3 VarChar (100),
    DataColumn4 VarChar (100)
)

DECLARE @Temp2 TABLE 
(
    DataColumn1 VarChar (100),
    DataColumn2 VarChar (100),
    DataColumn3 VarChar (100),
    DataColumn4 VarChar (100)
)

insert into @Temp1 Values (NULL, NULL, 0, 22)
insert into @Temp1 Values (NULL, NULL, 0, 23)
insert into @Temp1 Values (NULL, NULL, 0, 24)
insert into @Temp2 Values (0, 697, NULL, NULL)
insert into @Temp2 Values (0, 698, NULL, NULL)
insert into @Temp2 Values (0, 699, NULL, NULL)

SELECT 
    DataColumn1, 
    DataColumn2, 
    DataColumn3, 
    DataColumn4
FROM @Temp1

UNION ALL

SELECT 
    DataColumn1, 
    DataColumn2, 
    DataColumn3, 
    DataColumn4
FROM @Temp2
0 голосов
/ 05 августа 2009

Если у вас есть общее поле, указанное в вашем комментарии, используйте его с внутренним соединением:

ВЫБРАТЬ A, B, C, D ИЗ таблицы 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Table2 ON (Table1.CommonField = Table2.CommonField)

Это даст результат со всеми четырьмя столбцами в одной строке. Это предполагает, что CommonField является ключом-кандидатом хотя бы в одной таблице. Возможно, вам придется настроить INNER JOIN, чтобы он был LEFT JOIN в зависимости от того, нужны ли вам все поля из одной таблицы, если CommonField другой таблицы имеет значение NULL. Кроме того, если вам нужны все строки из обеих таблиц независимо от того, есть ли соответствующая строка в соответствующей таблице, вам нужно будет использовать LEFT JOIN и написать запрос дважды (один раз с Table1, присоединяющимся к Table2, и один раз с Table 2, присоединяющимся к Table1 ) и объединяйте их вместе - аналогично другим ответам, только с учетом общего поля.

Редактировать: Как насчет этого:

SELECT A1.A, B1.B, T2.C, T2.D 
FROM    (
            SELECT MAX(ID) ID, COUNT(ID) AS A 
            FROM Table1 WHERE Type = 0 GROUP BY Type
        ) AS A1 ON A1.ID = P.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS B 
                FROM Table1 WHERE Type = 1 GROUP BY Type
            ) AS B1 ON B1.ID = A1.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS C 
                FROM Table2 WHERE Type = 0 GROUP BY Type
            ) AS C1 ON C1.ID = A1.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS D 
                FROM Table2 WHERE Type = 1 GROUP BY Type
            ) AS D1 ON D1.ID = A1.ID
0 голосов
/ 05 августа 2009

Если вы немного более конкретны в том, что вы, я могу помочь вам лучше, но я попробую в любом случае. Если я вас понимаю, вы можете сделать это

Выберите A, B, NULL AS c, NULL AS D ОТ запроса 1

СОЮЗ ВСЕХ

Выберите NULL AS A, NULL AS B, с, D ОТ запроса 2

С наилучшими пожеланиями, Йордан

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