Można do tego celu użyć operatorów zestawu EXCEPT
or INTERSECT
. Tak:
SELECT id, name FROM master.dbo.test
EXCEPT -- or INTERSECT
SELECT id, name FROM test.dbo.testings
to daje:
wyjątkiem: zwrotów wszelkie odrębne wartości z lewej zapytania, które nie są znaleźć także na prawym zapytania.
INTERSECT: powraca jakieś odrębne wartości, które są zwracane przez kwerendy zarówno po lewej i prawej stronie operandu przecinać.
W twoim przypadku, ponieważ chcesz wybrać z dwóch różnych baz danych, trzeba użyć w pełni kwalifikowanej nazwy tabel. Muszą być w postaci database.schema.object_name
.
Aktualizacja: Jeśli chcesz porównać dwie tablice kolumny nazwy, nie samych danych, trzeba pracować z tabel metadanych porównać nazwy kolumn w ten sam sposób z EXCEPT
.
Na przykład załóżmy, że masz dwie bazy danych:
Test
baza danych zawiera tabelę:
create table test(id int, name varchar(10), dep varchar(50));
i innej bazy danych:
anotherdatabase
baza danych zawiera tabela:
create table testings(id int,name varchar(20), sal int);
I chcesz porównać dwie tabele kolumny i dostać tabele, które nie istnieją w innej tabeli, w naszym przykładzie trzeba dostać sal
i dep
.
Następnie można to zrobić:
SELECT ColumnName
FROM
(
SELECT c.name "ColumnName"
FROM test.sys.tables t
INNER JOIN test.sys.all_columns c
ON t.object_id = c.object_id
INNER JOIN test.sys.types ty
ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test'
EXCEPT
SELECT c.name
FROM anotherdatabase.sys.tables t
INNER JOIN anotherdatabase.sys.all_columns c
ON t.object_id = c.object_id
INNER JOIN anotherdatabase.sys.types ty
ON c.system_type_id = ty.system_type_id
WHERE t.name = 'testings'
) t1
UNION ALL
SELECT ColumnName
FROM
(
SELECT c.name ColumnName
FROM anotherdatabase.sys.tables t
INNER JOIN anotherdatabase.sys.all_columns c
ON t.object_id = c.object_id
INNER JOIN anotherdatabase.sys.types ty
ON c.system_type_id = ty.system_type_id
WHERE t.name = 'testings'
EXCEPT
SELECT c.name
FROM test.sys.tables t
INNER JOIN test.sys.all_columns c
ON t.object_id = c.object_id
INNER JOIN test.sys.types ty
ON c.system_type_id = ty.system_type_id
WHERE t.name = 'test'
) t2;
To powinno dać:
zauważyć, że: Dołączyłem tabele:
z tabelą:
dostać tylko te kolumny, które mają ten sam typ danych. Jeśli nie dołączyłeś do tej tabeli, jeśli dwie kolumny mają tę samą nazwę, ale inny typ danych, będą one takie same.
Cześć Mahmoud Gamel, dziękuję za udzielenie odpowiedzi, pamiętaj, że zawsze ustawiony operator działa na wiersz mądry, a nie kolumny mądry.moim wymaganiem jest to, że muszę porównać 2 kolumny tabeli, jeśli jakakolwiek tabela ma mniej kolumn niż inny, muszę zidentyfikować tę nazwę kolumny i muszę ją dodać. mam nadzieję, że jesteś nieporuszony. – Franklin
@ user1694000 - Przepraszamy za nieporozumienie. Więc chcesz uzyskać nazwy kolumn, których nie ma w żadnym z nich. Dobrze? Tylko nazwy kolumn. –
@ user1694000 - Zobacz moją edycję. –