webForumDet fria alternativet

Mer problem. Dubbla relationer?

10 svar · 296 visningar · startad av Jon

JonMedlem sedan juli 20011 304 inlägg
#1

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
#2

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
#3

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

untitled-1.gif
aasahMedlem sedan mars 20034 471 inlägg
#4

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
#5

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
#6

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
#7
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
#8

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
#9

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
#10

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
#11

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
136 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)