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.
where not exists
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
Jaki silnik bazy danych?
MS SQL
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;
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
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?
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.
Dokładnie tak samo zadziała dla widokow z tym że zamiast nazwy tabeli podajesz nazwę widoku.
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?
Zmieniasz tylko nazwę tabeli w warunku where na nazwę widoku nic innego nie ruszasz...
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
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
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
A co zwracają poszczególne podzapytania?
Panczo napisał(a):
A co zwracają poszczególne podzapytania?
edytowałem wyżej, opisałem bardziej szczegółowo
No to po kolei:
Czy zapytanie:
SELECT distinct table_catalog, table_name
FROM INFORMATION_SCHEMA.COLUMNS
Zwróci porównywane widoki?
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
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.
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)
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
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ę
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
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:)