Porównywanie 2 tabel w bazie danych

0

Witam mam taki problem i nie do końca mogę znaleźć rozwiązanie. Potrzebuje stworzyć zapytanie, w którym 2 tabele zostaną ze sobą porównane nie pod kontem rekordów a pod kontem kolumn. Przykładowo mamy jedną tabele, która posiada 100 kolumn i drugą, która jest bardzo podobna i chcę ze sobą porównać je i sprawdzić które których kolumn nie ma jednej z nich.

0

where not exists

0

Tak ale to jest do zawartości kolumn a mi chodzi o same kolumny. SELECT FROM [Database].[dbo].[Table1] WHERE NOT EXISTS (SELECT FROM [Database].[dbo].[Table2]) ---> nic mi to nie daje

0

Jaki silnik bazy danych?

0

MS SQL

2
SELECT kolA,
       KolB
FROM
(
    SELECT column_name kolA
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = N'nazwa_tabeli_1'
) a
FULL JOIN
(
    SELECT column_name kolB
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = N'nazwa_tabeli_2'
) b ON a.kolA = b.kolB;
0

Dziękuję Panczo, ale to nie jest cały czas to o co pytam. Jeśli będe miał na przykład 1000 kolumn to nie chce ich wypisywać po kolei. Chce CAŁE 2 tabele ze sobą porównać, takie które mają dowolną ilość kolumn w celu sprawdzenia które kolumny z tabeli 1 występuję w tabeli 2 ale bez wypisywania poszczególnych kolumn w selekcie

0

To co Ci podałem zwróci Ci w wyniku kolumny z tabeli nazwa_tabeli_1 (kolA) i kolumny z nazwa_tabeli_2 (kolB) jeżeli jakiejś kolumny nie będzie w nazwa_tabeli_2 to kolumna będzie miała wartość null i anlogicznie w drugą stronę. Jeżeli chcesz zobaczyć różnicę to wystarczy dodać warunek:

where
   kolA is null or kolb is null

Czego innego oczekujesz?

0

Dziękuję bardzo Panczo! Widziałem to troche inaczej w głowie, ale finalnie o to właśnie jednak chodzi :) Natomiast mam jeszcze jedno pytanie. Czy taką samą funkcję można stworzyć dla widoków w MS SQL.
próbowałem zmienić to dla widoków ale wyrzuca jakieś błędy i nie działa.

0

Dokładnie tak samo zadziała dla widokow z tym że zamiast nazwy tabeli podajesz nazwę widoku.

0

SELECT kolA,
KolB
FROM
(
SELECT view_name kolA
FROM INFORMATION_SCHEMA.VIEWS
WHERE VIEW_NAME = N'View1'
) a
FULL JOIN
(
SELECT view_name kolB
FROM INFORMATION_SCHEMA.COLUMNS
WHERE VIEW_NAME = N'View2'
) b ON a.kolA = b.kolB

WHERE
kolA IS NULL OR kolb IS NULL;

Czyli coś takiego?

0

Zmieniasz tylko nazwę tabeli w warunku where na nazwę widoku nic innego nie ruszasz...

0

Kiedy próbuje zmienić samą tabelę na widok to pokazuje pustą kolumnę..

SELECT kolA,
KolB
FROM
(
SELECT column_name kolA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'View1'
) a
FULL JOIN
(
SELECT column_name kolB
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'View2'
) b ON a.kolA = b.kolB

WHERE
kolA IS NULL OR kolb IS NULL;

SELECT* FROM [Project].[dbo].[View1] --- zwraca wszystkie kolumny z danymi

próbowałem też do TABLE_NAME podać "[Project].[dbo].[View1]" ale nie działa

Wrzucam załącznik ze screenem

0

A nie wpadło Ci do głowy, ze może ich struktura jest taka sama?

Puść bez warunku where:

SELECT kolA,
KolB
FROM
(
SELECT column_name kolA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'View1'
) a
FULL JOIN
(
SELECT column_name kolB
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'View2'
) b ON a.kolA = b.kolB

Bo jak można się przekonać dla widoków też działa: http://sqlfiddle.com/#!18/0fa95/1

0

ale ich struktura własnie nie jest taka sama(puszczałem bez where). Stworzyłem tak te widoki, że w jednym jest mniej o jedną kolumnę reszta jest taka sama, ale ten jeden null powinien pokazać.
Z resztą jak nawet sobie testowałem to tak, że zaznaczyłem fragment pierwszej części i dałem EXECUTE to wywołuje to samo czyli pokazuje puste kolA

0

A co zwracają poszczególne podzapytania?

0
Panczo napisał(a):

A co zwracają poszczególne podzapytania?
edytowałem wyżej, opisałem bardziej szczegółowo

0

No to po kolei:

Czy zapytanie:

 SELECT distinct table_catalog, table_name
    FROM INFORMATION_SCHEMA.COLUMNS

Zwróci porównywane widoki?

0

Nie nie ma tam ich.

A czy w w strukturze - " WHERE TABLE_NAME = N'View1'" zamiast N'VIEW1' mogę wkleić dokładne umiejscowienie widoku czyli coś takiego - "N'[Project].[dbo].[View1]'" ?

Dodam jeszcze, że widoki są w osobym folderze w całej strukturze bazy - w folderze VIEWS

0

Możesz to wkleić.
Ale wtedy nie dostaniesz NIC :)

W INFORMATION_SCHEMA.COLUMNS powinny być również kolumny SCHEMA_NAME i TABLE_NAME. Użyj ich.

0

Możesz, to tylko zapytanie nikt nie broni, szukaj czego chcesz, tylko pamiętaj, ze kolumna table_name zawiera nazwę tabeli, schemat i baza są w innych kolumnach...

Jeżeli nie widzisz kolumn z tych widoków, a masz pewność, że te widoki są to jedyne co zostaje to uprawnienia do podglądu definicji tych obiektów (VIEW DEFINITION)

0

Okej - problem był w tym, że nie widział tych widoków dlatego, że stworzyłem je poprzez narzędzie w ms sql do tworzenia widoków a nie przez new query. Teraz wszystko działa

0

A jeszcze takie jedno pytanie - czy w miejsce "WHERE TABLE_NAME = N'view1'" mozna podstawić parametr z "@"

czyli np

"WHERE TABLE_NAME = N'@parameter' "

chciałbym zrobić z tego procedurę

0

Można ale nie w ten sposób, bez apostrofów i N na początku, parametr powinien być jako nvarchar(128)

a przypisanie:

WHERE TABLE_NAME = @parameter
0
Panczo napisał(a):

Można ale nie w ten sposób, bez apostrofów i N na początku, parametr powinien być jako nvarchar(128)

a przypisanie:

WHERE TABLE_NAME = @parameter

sam już doszedłem do tego, ale dziękuję - o to chodziło:)

0 użytkowników online, w tym zalogowanych: 0, gości: 0