19. april 2016 - 15:25Der er
6 kommentarer og 1 løsning
"Kunder har også købt"
jeg sidder med 2 Ordrelister. lokal og net
kan jeg splejse det sammen og tilsidst få en liste af varer der ligger sammen med det produkt man kigger på
jeg kan godt gøre det ved en af listerne, men jeg kan ikke se hvordan jeg gør det med begge to.
som jeg tænker det skal foregå er at 1 finde ordrenr (som kan være ens) på alle de ordrer der har denne vare i 2 finde alle varer i disse ordre og sortere efter sum(Antal)
prøvet med dette som første trin, men det giver mig | 1123 | 1244 | | 1234 | 1244 | | 4321 | 1244 | | 1123 | 1555 | | 1234 | 1555 | | 4321 | 1555 | lidt ubrugeligt
SELECT table1.OOrdreNr, table2.LOrdreNr FROM (SELECT Ordrelinie.OrdreNr AS OOrdreNr FROM Ordrelinie WHERE Ordrelinie.VareNr = 'blabla' GROUP BY Ordrelinie.OrdreNr) table1 , (SELECT Lokaleordrelinie.OrdreNr AS LOrdreNr FROM Lokaleordrelinie WHERE Lokaleordrelinie.VareNr = 'blabla' GROUP BY Lokaleordrelinie.OrdreNr) table2
har prøvet lidt forskellige koder, så nu spørger jeg profferne. en nem eller besværlig løsning, en eller flere sql queries det er resultatet that matters now.
SELECT 1, 'local', OrdreNr AS local_ordrer FROM local.table.table1 WHERE local_ordrer.VareNr = 'blabla' UNION SELECT 2, 'remote', OrdreNr AS remote_ordrer FROM remote.table2 WHERE remote_ordrer.VareNr = 'blabla' ORDER BY 1
Tricket med at sortere på 1 og 2 giver dig resultaterne fra den første SELECT før den anden. Naturligvis kan du osse sortere på teksten, så skal du bare skrive 2 i ORDER-clause. Hvis du ønsker sortering på de samlede ordrer giver du den samme alias i begge udtræk og sortere på den. Så er det måske stadig interessant at bibeholde det første felt (1 og 2) eller teksten, så du kan se hvor ordren kommer fra.
Nice det er lige det jeg kiggede efter. Jeg viste ikke at man kunne lave en lille fiktiv kolonne med ejet data. min tanke havde være på union men viste ikke hvordan jeg kunne se forskel på de to ordre typer.
Laver den en ny kolonne bare med "SELECT 'col1', 'col2'" som ikke er fra tabellerne?
Ved anden del for at få alle vare i disse ordre har jeg dette.
SELECT VareNr, (Sum(nAntal)) FROM ( SELECT VareNr, Sum(Antal) AS nAntal FROM Ordrelinie WHERE ( ///asp kode loop Ordrelinie.OrdreNr = 2565 OR Ordrelinie.OrdreNr = 5771 ///asp kode loop !! ) AND (Ordrelinie.VareNr != 'blabla') GROUP BY VareNr UNION SELECT VareNr, Sum(Antal) AS nAntal FROM Lokaleordrelinie WHERE ( ///asp kode loop Lokaleordrelinie.OrdreNr = 12335 OR Lokaleordrelinie.OrdreNr = 38718 OR Lokaleordrelinie.OrdreNr = 41372 ///asp kode loop !! ) AND (Lokaleordrelinie.VareNr != 'blabla') GROUP BY VareNr ) AS t GROUP BY VareNr ORDER BY (Sum(nAntal)) DESC
Vis du har noget til den del må du gerne sige det. ellers giv et svar til point.
Laver den en ny kolonne bare med "SELECT 'col1', 'col2'" som ikke er fra tabellerne? ------------------------------ Ja, den helt rigtige ville være "SELECT 'col1' AS kol1, 'col2' AS kol2".
Du har ret. Den med at lave sine egne kolonner er ikke velkendt, men næsten uundværlig når man arbejder med UNION.
Jeg tror det vil kræve lidt for meget af mig at grave mig ind i anden del, og du har vist osse så meget check på det så du selv kan klare den. Hvis ikke så vend tilbage.
Jeg plejer at se UNION som et samlet udtræk af tabeller efter hinanden i modsætning til JOIN hvor udtrækket kommer ved siden af hinanden.
Hm! Nu kom jeg jo ind på spørgsmålet igen, og så vil jeg da lige komme med et par betragtninger til din anden del.
Uden for din subquery tester du på "AND (Ordrelinie.VareNr != 'blabla')". Jeg går ud fra at VareNr er numerisk så den betingelse vil aldrig (eller rettere - altid) blive opfyldt. Hvis det er for at sikre dig at DB-engine kommer gennem alle rækker, vil din samlede query i forvejen gennemgå alle rækker. Så mit bud er at du vil få præcist samme resultat med og uden betingelsen. Det eneste du opnår er at give DB-engine mere arbejde med at skrue gennemløbet sammen.
Lokaleordrelinie.OrdreNr = 12335 OR Lokaleordrelinie.OrdreNr = 38718 OR Lokaleordrelinie.OrdreNr = 41372 Disse linjer kan erstattes med: WHERE Lokaleordrelinie.OrdreNr IN (12335, 38718, 41372) Ikke den store betydning, men giver en mere overskuelig kode. Vagn
VareNr er en VarChar, den virker også som navn og til stregkoder. Jeg har desværre ikke været med, da man lavede den database ellers havde jeg nok lavet anderledes. Måske.
jeg tænkte på at lave en join til vare tabellen, så jeg kan tjekke det hele på en gang, f.eks. om vare findes eller er på lager. men lige nu er der andre opgaver på skærmen.
Din anden kode er også smart, jeg skal huske den, når jeg ændre/udvider koden engang.
Tja, umiddelbart lyder det som en databasse der kunne trænge til en tur på arbejdsbænken. Lad mig råde dig til at søge professionel hjælp når det kommer på tale. At strukturere, normalisere og indexere en 'primitiv' DB er ikke for begyndere.
jeg tænkte på at lave en join til vare tabellen Nu ved jeg jo ikke hvor store datamængder vi taler om, men sommetider kan det betale sig at indlæse varetabellen og lægge den i en intern tabel - specielt hvis du skal bruge den i flere sammenhænge. En query med både UNION og JOIN kan blive temmelig kompliceret, både for databasemotoren der skal bygge gennemløbet sammen og for fremtidige programmører hvis der skal rettes.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.