TSQL Сравнить результат 2 запросов - PullRequest
1 голос
/ 11 февраля 2012

У кого-нибудь есть идеи, как сравнить результаты двух запросов, которые имеют одинаковые имена столбцов, но в другом порядке?

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

[EDIT]

Чтобы быть более точным, мне нужно сравнить значение каждой строки и каждого столбца (с одним и тем же именем) из 2 разных запросов.

Пример:

результат запроса 1:

A|B|C|D
1|4|7|11
2|5|8|21
3|**6**|9|31

результат запроса 2:

A|B |D
1|4 |11
2|5 |21
3|**99**|31

В этом случае я хотел бы обнаружить, что Query2 в строке 3º в столбце B имеет другое значение. Мне все равно, что в Query2 нет столбца C, я просто хочу, чтобы все общие столбцы между обоими запросами имели одинаковые значения.

Спасибо

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Учитывая эти таблицы и данные:

USE tempdb;
GO

CREATE TABLE dbo.TableA
(
    A INT,
    B INT,
    C INT,
    D INT
);

CREATE TABLE dbo.TableB
(
    A INT,
    D INT,
    B INT
);

INSERT dbo.TableA SELECT 1,4,7,11
    UNION ALL SELECT 2,5,8,21
    UNION ALL SELECT 3,6,9,31;

INSERT dbo.TableB SELECT 1,11,4
    UNION ALL SELECT 2,21,5
    UNION ALL SELECT 3,31,99;

То, что вы, похоже, ищете, является одним из следующих:

-- those where at least one column doesn't match:
SELECT A,B,D FROM dbo.TableA
EXCEPT 
SELECT A,B,D FROM dbo.TableB;

Результаты (со стороны A):

A    B    D
---- ---- ----
3    6    31

ИЛИ

-- those where all columns DO match:
SELECT A,B,D FROM dbo.TableA 
INTERSECT 
SELECT A,B,D FROM dbo.TableB;

Результаты:

A    B    D
---- ---- ----
1    4    11
2    5    21

Если вы не знаете столбцы или не хотите выписывать их вручную, вы можете сделатьэто с динамическим SQL, просто передавая два имени таблицы (со схемой) в переменные.Обратите внимание, что это не перехватывает ошибки, которые возникнут, если столбцы no совместно используются двумя таблицами или если существуют одинаковые имена столбцов, но они имеют несовместимые типы данных.Эту обработку ошибок легко добавить, если вы хотите сделать решение более надежным.

DECLARE 
    @sql  NVARCHAR(MAX), 
    @cols NVARCHAR(MAX),
    @t1   NVARCHAR(511),
    @t2   NVARCHAR(511);

SELECT
    @sql  = N'',
    @cols = N'',
    @t1   = N'dbo.TableA',
    @t2   = N'dbo.TableB';

SELECT @cols = @cols + ',' + a.name
    FROM sys.columns AS a
    INNER JOIN sys.columns AS b
    ON a.name = b.name
    WHERE a.[object_id] = OBJECT_ID(@t1)
    AND b.[object_id] = OBJECT_ID(@t2);

SET @cols = STUFF(@cols, 1, 1, N'');

-- those where at least one column doesn't match:
SELECT @sql = N'SELECT ' + @cols + ' 
    FROM ' + @t1 + ' EXCEPT 
    SELECT ' + @cols + ' FROM ' + @t2 + ';';

EXEC sp_executesql @sql;

-- those where all columns DO match:
SELECT @sql = N'SELECT ' + @cols + ' 
    FROM ' + @t1 + ' INTERSECT 
    SELECT ' + @cols + ' FROM ' + @t2 + ';';

EXEC sp_executesql @sql;

Не забудьте очистить:

DROP TABLE dbo.TableA, dbo.TableB;
2 голосов
/ 11 февраля 2012

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

0 голосов
/ 02 января 2015

Вы можете сделать это только за один шаг:

SELECT *
FROM   (
       --compare  query a vs query b 
    SELECT ad.id_addetto,'not in b'y
    FROM   addetti ad
    WHERE  ad.id_addetto < 125 -- query a
    EXCEPT
    SELECT ad.id_addetto,'not in b'y
    FROM   addetti ad
    WHERE  ad.id_addetto < 166 -- query b
     UNION
    --compare  query b vs query a
    SELECT ad.id_addetto, 'not in a'y
    FROM   addetti ad
    WHERE  ad.id_addetto < 166 -- query b
    EXCEPT
    SELECT ad.id_addetto ,'not in a'y
    FROM   addetti ad
    WHERE  ad.id_addetto < 125 -- query a
    ) xx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...