[MSSQL] SELECT w SELECT

0

Mam następujący kod:

SELECT   [TwGId]
	,[Kod]
	,[Poziom]
	,[GIDNumer]
	,[GrONumer]
	,[Parent]
	,(SELECT [TwG_TwGID] FROM [CDN].[TwrGrupy] WHERE [TwG_Kod] = [Parent]) AS ParentId
	,[Sciezka]
FROM [CDN].[TwrGrupyViewSynchronizer]

Chcę, aby pobierało się ID rodzica po jego nazwie (niestety baza jest zbudowana w ten sposób, że nie sposób inaczej odczytać relacji).
Jak to uczynić?
Z góry dziękuję za pomoc!

0

Nie wiem czy dobrze zrozumiałem, ale nie chodzi przypadkiem o najzwyklejszy JOIN?

SELECT TwGId, Kod, Poziom, Parent, TwG_TwGID AS ParentId FROM TwrGrupyViewSynchronizer
INNER JOIN TwrGrupy ON TwG_Kod = Parent;

(albo LEFT JOIN, zlaeży od rodzaju relacji)

0

Niestety tabela [CDN].[TwrGrupy] zawiera także kupę innych śmieci, zatem będę miał NULL'e z lewej albo z prawej w zależności od złączenia.
A na zwykłym JOIN zwraca wynik pusty...
Działa to tak, jakby tu:

ON TwG_Kod = Parent

Parent nie miał wartości. A w wyniku są jego wartości.

0
SELECT tgvs.TwGId, tgvs.Kod, tgvs.Poziom, tgvs.Parent, tg.TwG_TwGID AS ParentId 
FROM TwrGrupyViewSynchronizer tgvs
LEFT JOIN TwrGrupy tg ON tg.TwG_Kod = tgvs.Parent;

Podaj przykładowy wynik, który chcesz uzyskać oraz podaj przykładowe 3 linijki z obu tabel. To znacznie przyspieszy uzyskanie odpowiedzi. Powiedz co z linijkami gdzie są nulle, co ma być zamiast nich?

0

Zawartość tabeli [TwrGrupy] znajduje się tutaj: http://xle.pl/sql/wyniki_TwrGrupy.html
Mam jeszcze widok który dodatkowo zwraca [Kod] rodzica i chciałbym po tym kodzie określić ID z tabeli [TwrGrupy]. Niestety program był pisany we wczesnych latach '90, więc relacje nie są tu dobrze zrobione.

PS. w wynikach [TwrGrupy] wiersze mające numer zamiast kodu to zawartość grupy. Nie mam pojęcia w jakim celu jest to tutaj przepisywane...

PS2.

AdamPL napisał(a)
SELECT tgvs.TwGId, tgvs.Kod, tgvs.Poziom, tgvs.Parent, tg.TwG_TwGID AS ParentId 
FROM TwrGrupyViewSynchronizer tgvs
LEFT JOIN TwrGrupy tg ON tg.TwG_Kod = tgvs.Parent;

Podaj przykładowy wynik, który chcesz uzyskać oraz podaj przykładowe 3 linijki z obu tabel. To znacznie przyspieszy uzyskanie odpowiedzi. Powiedz co z linijkami gdzie są nulle, co ma być zamiast nich?

Powyższe zapytanie zwraca wszystkie grupy, a w ParentId są wszędzie NULL.

Wygląda to tak, jakby nie można było łączyć widoku z tabelą (???).

0

Są trzy wyjścia:

  1. W TwG_Kod jest coś innego niż w Parent, może w jednej z tych tabel napisy są ze spacjami przez co nie da się ich wprost porównać.
  2. Twoja wersja MSSQL nie radzi sobie z porównywaniem napisów ;)
  3. Twoja wersja MSSQL nie radzi sobie z joinowaniem tabelki do viewsa ;)

Ostatnie dwa wyjścia dałem z przymrużeniem oka, bo choć nie znam starszych wersji mssql niż 7.0 to raczej jest to mało prawdopodobne.

Na wszelki wypadek sprawdź dobrze pkt. 1 a jak nadal nie będziesz wiedział o co chodzi to chociaż zrób screena z wyniku zapytania: select * from dbo.TwrGrupyViewSynchronizer

0
AdamPL napisał(a)
SELECT * FROM CDN.TwrGrupyViewSynchronizer

Wynik:
http://xle.pl/sql/wyniki_TwrGrupyViewSynchronizer.html

0

Heheh tak jak mówiłem :) W tym viewsie dostajesz wartości w polu Parent ze spacją na początku.

Teraz albo zrób złączenie z trimem

SELECT tgvs.TwGId, tgvs.Kod, tgvs.Poziom, tgvs.Parent, tg.TwG_TwGID AS ParentId
FROM TwrGrupyViewSynchronizer tgvs
LEFT JOIN TwrGrupy tg ON tg.TwG_Kod = ltrim(tgvs.Parent);

albo najlepiej w tabelce z której pobierasz Parent do viewsa zrób update:

update tabelka
set Parent = ltrim(Parent)

a jeszcze lepiej będzie jak zamienisz te Parent na liczby, bo łączenie po napisach to jak sam widzisz bardzo kiepski pomysł, również ze względu na wydajność. Kolejna sprawa załóż klucz obcy na tej tabelce z której bierzesz Parent do viewsa.

0

Niestety nie mogę modyfikować tabel programu, bo przy jego auto updacie szarpnie mi całość...
Zaraz wypróbuję ltrim.

LTRIM() działa wyśmienicie! Dziękuję!

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