SQL query

Tags:    sql query

Hej har følgene problem jeg ikke helt kan få hen.

Vil gerne lave en forespørgsel på PRM2G5H11N hvor den så skal returnere 215356

Fold kodeboks ind/udKode 


Og man kender selvfølgelig ikke mellem værdierne på forhånd.

Man kan også komme ud for at table ser sådan ud

Fold kodeboks ind/udKode 


Så når du laver en forespørgsel på PRM2G5H11N returnere den 215356 & 215355

Kan det i det hele taget lade sig gøre i SQL ?



Indlæg senest redigeret d. 12.06.2013 12:56 af Bruger #17295
8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 11 karma
Sorter efter stemmer Sorter efter dato
Det er vidst nok muligt, men bøvlet, med simple operationer. Vil anbefale du kigger på de mere avancerede funktionaliter i dit databasesystem. Her er en version med postgresql's WITH RECURSIVE (som faktisk er iterativt):

Fold kodeboks ind/udSQL kode 


Den fungerer som en for løkke. Først vælger vi startdelen som ikke må afhænge af search, her din givne AL og den dybde vi fandt den på. Denne værdi bliver lagt i en skjult resultat-tabel samt i en arbejdstabel.

1. Så længe arbejdstabellen ikke er tom.
2. Lav en ny iteration (delen under UNION ALL). Her vælger vi de EL'er vi kan komme fra de nuværende AL'er i arbejdstabellen. Search svarer til arbejdstabellen når der SELECTes.
3. Resultatet af dette bliver lagt oveni resultatstabellen samt bliver til den nye arbejdstabel.
4. Gå tilbage til 1.

Læg mærke til at iterationen stopper når vi har kørt iteration 5 gange (sat i koden) fordi så bliver det nye resultat tomt, dermed arbejdstabellen bliver tom og iterationen er slut:

AL, depth (i search)

PRM2G5H11N 0

#1 iteration

PRICG5B11T 1

#2 iteration

PRCJG5912T 2
PRCJG5913T 2

#3 iteration

215356 3
215355 3

Alle de forrige iterationer ligger som sagt i resulttabellen.

Jeg har en sqlfiddle her med det, men har alligevel lagt koden her siden sqlfiddlen kan blive 'fiddlet' med.

http://sqlfiddle.com/#!1/0c417c/17/0

Hvis du kun vil have AL kolonnon trækker du bare kun den ud:

Fold kodeboks ind/udSQL kode 




Indlæg senest redigeret d. 12.06.2013 14:04 af Bruger #14645
Hvordan hænger AL og EL sammen? Der skal være en sammenhæng mellem dem, for at du kan vide hvad der skal returneres.

*edit*

Jeg kan se på de andre svar at det kan lade sig gøre. Men jeg er stadig nysgerrig efter, hvad sammenhængen er :D



Indlæg senest redigeret d. 12.06.2013 14:06 af Bruger #9814
Måske det kan løses med en stored procedure. Hvilken database server skal det køre på?

Er det et fast antal hop?
Vil slutværdien altid være en integer? Og ville de forskellige mellemled altid være en IKKE-integer?

Der findes også en måde, hvor du mærker elementer i dit datatræ med 2 ekstra værdier. De 2 værdier angiver hvilket omfang den enkelte node har.

Her er et udmærket diagram der illustrerer det:

http://www.sitepoint.com/hierarchical-data-database-2/

Der er også kode der generer værdierne for dig. Det er faktisk en super måde at arbejde med træer på.



Brian:

Første AL kommer fra en anden table, og når man så laver et opslag returnere den EL næste opslag skal man slå det returneret EL op som AL indtil man får XXXXXX


Stefan:

Det skal køre på en SQL 2008
Mellemled vil aldriv være int og slut resultat vil altid være int

Søren:

Ser super ud, vil prøve at se om jeg kan få det hen på MS SQL :)




Fandt dette link http://msdn.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx. Syntaksen og semantikken er næsten identisk med postgres, de kalder bare base-trinnet for 'anchor'.

Hvis du ved at der ikke er nogen cyklusser i dine IDer, inklusiv alle mellemliggende, kan du droppe depth kolonnen og dens del i WHERE klausulen. Men ellers kan du ikke siden det vil føre til en uendelig løkke.

Men det ser ud til at du kun er interesseret i de allersidste ('dybeste') værdier, hvis det er tilfældet så kan du udvælge dem på dybden:
Fold kodeboks ind/udSQL kode 


Ellers, hvis resultaterne ikke er i samme dybde kan du eventuelt tælle tegnene, eller tjekke om der startes med 'PR' eller om det er en int eller lign.



Indlæg senest redigeret d. 12.06.2013 15:26 af Bruger #14645
Er kommet frem til dette, men det er ikke helt ok.

Istedet for at returnere

PRCJG5913T 215355
PRCJG5912T 215356

Vil jeg gerne have den til at returnere

PRM2G5H11N 215355
PRM2G5H11N 215356

Fold kodeboks ind/udSQL kode 


http://sqlfiddle.com/#!3/1e37d/25



Den del kan ikke ordnes i iterationen, fordi den bruger 'al' til at finde 'el'erne. Men siden du kender dit udgangspunkt kan du bare vælge den direkte:
Fold kodeboks ind/udSQL kode 





Det endte med at bliver sådan her :)

http://sqlfiddle.com/#!3/1e37d/38

Fold kodeboks ind/udSQL kode 



Takker for de fine råd der hjalp mig godt på vej :)



Indlæg senest redigeret d. 13.06.2013 16:33 af Bruger #17295
t