» »

SQL sortiranje JOIN

SQL sortiranje JOIN

korenje3 ::

	FROM [OrderItem]
	JOIN [Supplier]		ON [Product].SupplierId =	[Supplier].Id
	JOIN [Order]		ON [OrderItem].OrderId =	[Order].Id
	JOIN [Product]		ON [OrderItem].ProductId =	[Product].Id
	JOIN [Customer]		ON [Order].CustomerId =		[Customer].Id


A kdo mogoče ve, na kakšen način bi lahko tole sortiral, tako da bi bilo pravilno?
Naredil sem sicer algoritem, ki izlušči vse povezave glede na izbrano tabelo, sam očitno ni pravilno sortirano.

Naj glede na [OrderItem] vzamem vsako naslednjo, ki ima to ime? Sam to očitno ne gre...
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

smacker ::

product daj pred supplier

korenje3 ::

Kakšen je točen postopek, če bi hotel sortirat vse?
Recimo da prelagam vrstice iz enega arraya v drugega...
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

Vazelin ::

Sortiraš lahko po več stolpcih.

Kako si ti predstavljas sortiranje po vse?

korenje3 ::

Torej začnem z [orderitem] in potem čekiram če obstaja v naslednjem za ON in prvega dam takoj za tem. In potem tako naprej dokler gre?
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Tody ::

Tole te malce sql znanja manjka? Mislim da rabis povedat kako se tabele povezujejo, po katerem stolpcu. In potem lahko poves po katerem stolpcu zelis da sortira najprej in dolocis ali naraščajoče ali padajoce

Vazelin ::

Korenjae:
Order by stolpec1 asc, stolpec2 desc

=

Vsi zapisi bodo sortirani najprej po stolpcu 1 naraščajoče in potem še znotraj te skupine po srolpcu 2 padajoče

korenje3 ::

Tody je izjavil:

Tole te malce sql znanja manjka? Mislim da rabis povedat kako se tabele povezujejo, po katerem stolpcu. In potem lahko poves po katerem stolpcu zelis da sortira najprej in dolocis ali naraščajoče ali padajoce


Sem že preko te faze. Mene samo zanima, po katerih pravilih morajo biti JOIN po takem zaporedju, da bo delalo...
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Vazelin ::

Lol vrstni red joina ima vpliv na default sortiranje? Zakaj ne sortiraš ročni ffs?

Zgodovina sprememb…

  • spremenilo: Vazelin ()

korenje3 ::

Ker imam avtomatizirano da pobere ključe iz sql baze in poveže samodejno glede na specificirano tabelo.

Povezave mi normalno generira, zaporedja pa ne vem kako bi.

Recimo kako veš da [supplier] ne more biti na 1. ali 2. mestu z joinom?
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

korenje3 ::

Sam mislim da sem že pogruntal.
Vse tabele na levi strani dam v en array in jih zaporedno preverjam s tabelo takoj za ON. Če se ujema dam tabelo v zaporedje.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Vazelin ::

Pomojem ni nobenemu jasno kaj ti sploh delaš ;)

smacker ::

Tabelo supplier povezuješ s tabelo product, zato moraš product najprej zjoinat, šele nato lahko supplierja. Si pa res nerazumljiv :)

Tody ::

Vem kaj ti hočeš, samo to ni tako preprosto, zadaj je kup ene logike, ki pobira podatke iz baze, kot ti napišeš select. Od tega kateri stolpci so notri, do tega kako so označeni stolpci, do raznih hintov in povezav med tabelami do ne nazadnje statistke, dostopa.

Tvoj pristop se zato zna zjebat, ko se parser od baze odloči drugače prikazovat podatke kot ob tvojem prvem poskusu.

Recimor

select top 1000 stolpecA from tabela1 lahko vrne podatke iz Id od 1 do 1000 lahko pa jih vrne od 500 do 1500, on samo čaka da se mu 1000 vrstic nafila v memorijo in potem ustavi query. Noben ti pa ne garantira da bo zmeri istih 1000 id-jev prišlo notri.

Zato pač order by group by in over() ukazi.

Lonsarg ::

NIKOLI se ne zanašat na default sortiranje. Ever, ever.

Bo od verzije SQL-a različno, pa od tega kaj kdo drug tisti trenutek poganja na bazi! Nekateri SQL strežniki namreč optimizirajo, če nekdo ravno bere iz neke tabele in zaženeš query se bo ta query "vlekel" zraven tistega prejšnega in začel torej recimo na sredini tabele in nakoncu šel še drugo polovico iskat. Skratka no-go.

Viewi žal zaradi low-level implementacije order by ne omogočajo, če torej ne moreš v kodi uporabit order by ti preostanejo procedure in funkcije.

Zgodovina sprememb…

  • spremenil: Lonsarg ()

MrStein ::

Vazelin je izjavil:

Pomojem ni nobenemu jasno kaj ti sploh delaš ;)

Strojno generira SQL.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

MrStein ::

korenje3 je izjavil:

Sam mislim da sem že pogruntal.
Vse tabele na levi strani dam v en array in jih zaporedno preverjam s tabelo takoj za ON. Če se ujema dam tabelo v zaporedje.

Lahko uporabiš implicitno sintakso, kjer je vrsti red nepomemben:

	FROM [OrderItem], [Supplier],[Order],[Product],[Customer]
WHERE
    [Product].SupplierId =	[Supplier].Id
AND [OrderItem].OrderId =	[Order].Id
AND [OrderItem].ProductId =	[Product].Id
AND [Order].CustomerId =	[Customer].Id
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

korenje3 ::

sem nekako tako naredil.

    ftablecnt = 0
    Dim added As Boolean
    Dim shc() As Variant: ReDim shc(0): shc(0) = EdgeTables.Keys(0)
    Dim edgtabsorted As Variant: edgtabsorted = Array()
    Do While ftablecnt < 150
        For Each ft In fktables.Keys
            If Me.IsInArray(fktables(ft)(0), shc) = True And Me.IsInArray(fktables(ft)(3), shc) = False Then
                ReDim Preserve shc(UBound(shc) + 1): shc(UBound(shc)) = fktables(ft)(3)
                ReDim Preserve edgtabsorted(UBound(edgtabsorted) + 1)
                edgtabsorted(UBound(edgtabsorted)) = fktables.Item(ft)
                added = True
            End If
        ftablecnt = ftablecnt + 1
        Next
        If added = False Then Exit Do
        added = False
    Loop


i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL vprašanje

Oddelek: Programiranje
81048 (647) MrStein
»

Neveljaven mysql stavek - napaka #1054 - Unknown column 'PRODUCTS.TAXCAT' in 'on clau

Oddelek: Programiranje
101940 (1814) MrStein
»

[SQL] Unikatni izpisi

Oddelek: Programiranje
212064 (1451) 111111111111
»

[C#,SQL]

Oddelek: Programiranje
51143 (1056) JanOlMajti
»

Baza & c#

Oddelek: Programiranje
214014 (3072) xardas

Več podobnih tem