JonMedlem sedan juli 20011 304 inlägg Nu börjar jag gräva ner mig ordentligt i SQL-träsket och upptäcker samtidigt att jag inte kommer ihåg sådär jättemycket från tiden man pluggade :)
Tänkte bolla ett problem med er:
Jag håller på mer en webbbaserad applikation som ska hålla reda på ärenden. Min huvudtabell heter Tasks.
Nu är det så att jag vill simulera Novell när det gäller användare och rättigheter i applikationer. Detta innebär att jag bara har en tabell för alla användare, Usr
Rättgheterna har jag delat upp i 4 olika kategorier och de kommer senare bestämma vad man får se och göra.
Problemet är nu att jag har min Tasks - tabell. Den har i dagsläget 2(!) nycklar från Usr - tabellen. Nämligen TechId och CustomerId som båda går till UsrId i Usr-tabellen.
Frågor:
1: Är det OK att ha en sådan datamodell? (Om ja gå till 2:)
2: Hur ska jag då få fram alla ärenden på ett bra sätt?
Behövs det bilder eller är jag tydlig nog?
aasahMedlem sedan mars 20034 471 inlägg Jag tror att det skulle bli lite lättare att se hur du tänker om du slänger upp vad tabellerna innehåller och anger varje tabells nyckel/nycklar.
Rent generellt finns det inget som hindrar att du har två nyckelvärden men det kan ju vara mer eller mindre bra beroende på skälet.
JonMedlem sedan juli 20011 304 inlägg Den intressanta delen av databasen ser ut såhär (bifogad gif-fil) :)
Anledningen till att jag vill ha allt i samma tabell är som sagt att jag i framtiden kommer att plocka användarna ur en Novell NDS och sedan avgöra rättigheterna beroende på grupptillhörighet.
Det blir minst konvertering på det här sättet tror jag.
Men jag är alltid öppen när folk kommer med nya goda förslag! :D
aasahMedlem sedan mars 20034 471 inlägg Nu förstår jag ingenting... :q Varför går Task.techId till User?? Så vitt jag förstår av din modell borde den relatera till HelpTech och inte till User? Det finns väl ingenting i User som relaterar till techId?
JonMedlem sedan juli 20011 304 inlägg Jo. Du kan bortse från helptech helt så länge. Den är till för att koppla flera tekniker till en Task.
Så här ligger det till:
En Task har en TechId och en CustomerId
Inga konstigheter om det fanns en Tech-tabell och en Customertabell.
MEN: Nu är en Customer och en Tech samma sak. Därför finns det bara en tabell: Usr
Dvs bådet Tasks.TechId och Tasks.CustomerId är relaterade till Usr.UsrId
Tänk dig att en tekniker behöver hjälp av en annan. Eller till och med att man lägger upp ett ärende om att hjälpa sig själv med något. I det fallet är ju TechId och CustomerId samma och kopplat till UsrId
:)
JonMedlem sedan juli 20011 304 inlägg Nu har jag kommit så här långt:
SELECT
Tasks.TaskId, Tasks.Taskdescription, Tasks.TaskRegdate, Tasks.TaskDeadline,
Tasks.TechId, Tasks.CustomerId, Usr.UsrName,
Priority.PriorityId, Priority.PriorityName
FROM
Usr, Tasks, Priority
WHERE
Usr.UsrId = Tasks.CustomerId AND
/* Usr.UsrId = Tasks.TechId AND */
Tasks.PriorityId = Priority.PriorityId
ORDER BY Usr.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate
Problemet är att jag vill få med ett till Usr.UsrName från Usr, nämligen det som motsvarar Task.TaskId
*slår i lite referensverk men känner mig mest förvirrad*
Kanske är jag lite puckad eller kanske är det för att det är 28 grader celcius här inne idag ;)
LarsGMedlem sedan dec. 200012 464 inlägg SELECT
Tasks.TaskId, Tasks.Taskdescription, Tasks.TaskRegdate, Tasks.TaskDeadline,
Tasks.TechId, Tasks.CustomerId, U1.UsrName as u1,
Priority.PriorityId, Priority.PriorityName,
U2.UsrName as u2
FROM
Usr as u1, usr as u2, Tasks, Priority
WHERE
U1.UsrId = Tasks.CustomerId AND
U2.UsrId = Tasks.TechId AND
Tasks.PriorityId = Priority.PriorityId
ORDER BY U1.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate
JonMedlem sedan juli 20011 304 inlägg tack Lars!
du är verkligen en äkta vardagshjälte :D
Om jag nu vill använda inparametern @SortExpr för att kunna styra om sorteringen, är det bara att sätta den först i sorteringen eller måste jag komplicera till det hela lite?
Jag har naturligtvis testat men får lite underliga resultat...
typ:
ORDER BY @SortExpr, U1.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate
LarsGMedlem sedan dec. 200012 464 inlägg Så enkelt är det inte.
I detta fall kommer @sortExpr att tolkas som ett konstant värde (och inte som ett kolumnnamn) så den kommer inte att påverka sorteringsordningen.
Det finns två alternativ
dynamisk sql
exec('select ... order by ' + @sortExpr + ' U1.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate')
eller
order by
case @sortExpr
when 'C1' then C1
when 'C2' then C2
when 'I1' then cast(I1 as varchar) end
där i1 är en numerisk kolumn och c1/c2 är character. Man måste använda cast eftersom alla värden i en case måste vara av samma typ. (Alternativt kan man dela upp det i flera olika case.)
JonMedlem sedan juli 20011 304 inlägg Ok. Då färstår jag. Det kanske till och med skulle vara lättare att bara skicka med siffror som motsvarar kolumnnamnet man vill sortera på.
Men om man vill sorter apå flera kriterier hur blir syntaxet då?
Typ:
ORDER BY
CASE @sortExpr
WHEN IsNull THEN U1.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate
WHEN 'CustomerName' THEN U1.UsrId
WHEN 'TaskDeadline' THEN CAST(Tasks.TaskDeadline AS VARCHAR)
WHEN 'PriorityId' THEN CAST(Tasks.PriorityId AS VARCHAR)
END
Om du vill kan du gärna referara till nån bra sida eller uppslagsverk på nätet. Det är inte så att jag bara är slö och sitter och frågar men jag har faktiskt inte hittat nåt som ger en bra översikt.
Alla sidor som beskriver sortering och when som jag hittat sorterar endast p åen kolumn :)
JonMedlem sedan juli 20011 304 inlägg Löste det genom en IF-sats men det blir ganska mycket upprepande av kod. Nåja :)
IF (@sortExpr = NULL) -- Normal sorting
BEGIN
-- kod
ORDER BY U1.UsrId, Tasks.PriorityId, Tasks.TaskDeadline, Tasks.TaskRegdate
END
ELSE -- Custom sorting
BEGIN
--kod
ORDER BY
CASE @sortExpr
WHEN 'CustomerName' THEN U1.UsrId
WHEN 'TaskDeadline' THEN CAST(Tasks.TaskDeadline AS VARCHAR)
WHEN 'PriorityId' THEN CAST(Tasks.PriorityId AS VARCHAR)
END
END