С учетом этих таблиц и данных:
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
OR
-- 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;
Какого типа сравнения вы хотели сделать? –
Сравните как? Найти все строки в A, которые не находятся в B? –
Нужна дальнейшая информация здесь ... слишком универсальная ... на этом уровне нельзя сказать много. – judda