Just nu i M3-nätverket
Gå till innehåll

Select fråga (hur man ska skriva den)


jeos

Rekommendera Poster

Hej,

 

Har ett problem med att skriva en select sats som jag vill. Försöker ta det kort hoppas ni förstår.

 

Säja att ni har två tabeller en paket tabell samt en order tabell. Här är det då så att en order inehåller flertal paket. Vad jag vill få fram med select satsen är ordrar som är HELT klara, alltså bara visa ordrar där ALLA paket i den ordern har fått staus "klar", vilket då är ett fält i paket tabellen. Alltså denna select sats ska inte "träffa"/visa nått så länge inte alla paket som är länkade till den specifika ordern fått rätt status.

 

Detta får jag inte att funka, hoppas på att någon här kan lösa detta. Mycket tacksam för hjälp.

 

mvh

Jesper

 

Tråden flyttad från SQL Server av moderator

 

[inlägget ändrat 2009-04-22 10:50:01 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Något typ:

 

SELECT *

FROM order

WHERE NOT EXISTS (SELECT 1 FROM paket WHERE paket.orderid = order.orderid AND paket.status <> 'klar')

 

 

 

Länk till kommentar
Dela på andra webbplatser

Phenomen

 

Tack för dina ansträngningar, men får inte detta att fungera...tyvärr.

kan inte följa med i din tankegång om hur detta skulle kunna fungera, vet inte om man håller på att bli för trött ellergammal :) Aja tack för svar i alla fall. Orkar du dig på en förklaring så är jag tacksam.

 

 

[inlägget ändrat 2009-04-22 20:06:46 av jeos]

Länk till kommentar
Dela på andra webbplatser

jarlh,

 

Hänger tyvärr inte alls med här hur du tänker. orkar du förklara närmare vore jag tacksam.

 

[inlägget ändrat 2009-04-22 20:06:04 av jeos]

Länk till kommentar
Dela på andra webbplatser

Ska försöka ta det kort, din select fråga funkar så länge kunden har EN order lagd, vid fler ordrar på samma kund

fungerar den tyvärr inte.

 

Kort ungefär hur detta system funkar samt databasmodell.

 

Hirarkin ser ut som följer (ungefär). Först finns en kundtabell, senda en kontraktstabell, sedan då order och paket. Dessa har relationen

1 till många neråt. Dvs. En kund kan ha flera kontrakt, ett kontrakt kan inehålla flera ordrar osv.

 

När man lägger en order till en kund så skapas även paketen initial vid orderlägning, dvs. vilka paket som ska följa med ordern. Och då får paketen status "Till Produktion". Detta är alltså en tillverkningsindustri. Och när ett paket är fördigtillverkat så skrivs det ut ett paketspec som sätts fast på paketet. och nu ändrar även systemet status till "klar". Och sen när traktorföraren lastat paketet så får det status "levererat". Vad kunden till detta företag alltså vill kunna se är när deras order är HELT klar, dvs. ALLA paket i EN specifik order har fått status klar eller levererat, speller igen roll vilket. Så en kund har ofta flertal ordrar i produktion, och paketen blir klar vid olika tillfällen.

 

Har själv varit inne ungeför på den lösningen du skrivit....men inte funkat fullt ut. Det är MS SQL 2005 som detta system körs mot, och ja exists funktionen fungerar. Spelar heller ingen roll om man skriver <> eller !=.

Det som inte går att skriva i ms sql är som du gjort group by, man måste speca i select satsen dom kulumner som man ska gruppera. Alltså det går inte select * from ... utan man måste då skriva select tb_order.orderid om man ska ha en group by tb_order.orderid.

 

Hmm, men det funkar alltså för dig på mysql? f-n vad konstigt...

 

[inlägget ändrat 2009-04-22 23:12:42 av jeos]

Länk till kommentar
Dela på andra webbplatser

MySQL är "flexibel" då det gäller GROUP BY, medan SQL Server följer SQL-standarden.

 

Tumregeln för GROUP BY är att kolumner i SELECT-listan ska antingen specas även i GROUP BY eller vara argument till set-funktioner (SUM, COUNT, AVG, MAX etc)

 

(Om man gör GROUP BY utan att använda sig av set-funktioner kan man lika gärna göra SELECT DISTINCT.)

 

 

Sedan tycker jag det är lustigt att nu plötsligt dyker saker som kundtabell och kontraktstabell upp. Gör man en tydlig beskrivning av problemet redan från börjar, gärna med tabell- och kolumn-namn, är det betydligt lättare att få rätt svar snabbt. Förenkla gärna, men ta bara bort sådant som är oväsentligt.

 

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
Skapa en temp-tabell (Identisk emd tb_order)

Skapa hellre en in-memory TABLE-variabel (om det är SQL Server det handlar om) då temporära tabeller påverkar prestandan mycket mer negativt. Dessutom låser de ju tempdb-databasen tills transaktionen är klar, vilket naturligtvis påverkar prestandan än mer i ett fleranvändarsystem.

Cursors bör man ju också undvika så långt det är möjligt, men om det är enda lösningen så är det ju inte mycket att göra (har inte studerat problemet i detalj, bara lämnar en prestanda-sidetopic)

 

[inlägget ändrat 2009-04-23 11:55:52 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Tack för all svar..

 

Ja, det skrivs i sp...men ska man börja med temp tabeller osv. är det lika bra att lägga i denna funktion i c#-koden. Som idag gör det bara ett record count per order på hur många paket som är lagda som då sedan jämförs med antal som fått status klar. När dessa översenstämmer är ju hele ordern klar. dock är detta inte så snyggt sätt.

 

Sedan var den någon som tyckte det vara kostig att fler tabeller dyker upp. Har ingen betydelse för problemmt i sig. Bara mer omfattande beskrivning av läget. Får man ursprungs frågan att funka är problemmet löst.

 

Phenomen,

 

Din svar är bra och gennererar inga error, utan bara "felaktigt" resultat då man har fler än en order. var dock trött då jag provade kan ha gjort nått fel. Hoppas jag har tid i helgen så ska jag försöka.

 

Länk till kommentar
Dela på andra webbplatser

Phenomen,

 

Tack för all hjälp...hade aldrig tänkt på trigger i detta fall, så får jag inte till select-saten så bli det helt klart det allternativet. Det får du klart poäng för :)

 

mvh

Jesper

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Phenomen: Se följande enbart som ännu ett allmänt tillägg till den teknik du föreslår; inte alls någon negativ kritik, för du hjälper bra.

 

Triggers är något som jag (och många med mig) anser skall användas EXTREMT sparsamt och enbart när inga andra alternativ finns kvar (vilket det i de flesta fall finns). Jag vet att det i många fall är lockande att använda dem och jag har gjort det misstaget allt för ofta. Men ur förvaltningssynpunkt, och för spårbarhet och felsökning överhuvudtaget, innebär triggers ofta mer huvudvärk än de problem de löser.

 

Visst, sitter man med ett litet system och vet med sig att ingen annan än en själv någonsin kommer använda det och att det inte kommer växa nämnvärt, då är det ok. Men sådant vet man i de flesta fall inte i förväg.

 

Bara en liten varning i all välmening (byggd på frustrerande egen erfarenhet)

 

[inlägget ändrat 2009-04-25 07:51:44 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
Vad hade du för erfarenhet?

Gärna exempel.

Varför kan du inte ta konstruktiv kritik utan motfrågor? Du har gett bra råd, som jag redan sagt, men också råd som i många fall ses som dålig databasmetodik.

Om du inte förstår betydelsen av begreppen spårbarhet och felsökning så är det inte så stor mening med att jag ger ett exempel från verkligheten, det skulle inte ge dig så mycket. Förstår du däremot begreppen så skall det inte finnas behov av att se ett exempel från verkligheten, då ska du veta vad jag pratar om.

 

 

[inlägget ändrat 2009-04-25 23:05:58 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Anjuna har jobbat professionellt med webbutveckling under många år så han har lång och gedigen erfarenhet att stödja sig på.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...