---
title: "Mer problem. Dubbla relationer?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/82964-mer-problem-dubbla-relationer"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Jon"
published: "2003-07-29T07:57:24.000Z"
updated: "2003-07-31T09:51:02.000Z"
replies: 10
views: 314
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/82964-mer-problem-dubbla-relationer"
---

# Mer problem. Dubbla relationer?

## #1 — Jon, 2003-07-29T07:57Z

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?

Permalänk: https://www.webforum.nu/p/82964

## #2 — aasah, 2003-07-29T11:50Z

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.

Permalänk: https://www.webforum.nu/p/1123018

## #3 — Jon, 2003-07-29T13:12Z

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

Bilagor:

- [untitled-1.gif](https://www.webforum.nu/a/1781.gif)

Permalänk: https://www.webforum.nu/p/1123059

## #4 — aasah, 2003-07-30T11:13Z

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?

Permalänk: https://www.webforum.nu/p/1123645

## #5 — Jon, 2003-07-30T11:20Z

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

:)

Permalänk: https://www.webforum.nu/p/1123652

## #6 — Jon, 2003-07-30T14:02Z

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  ;)

Permalänk: https://www.webforum.nu/p/1123755

## #7 — LarsG, 2003-07-30T14:20Z

```
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
```

Permalänk: https://www.webforum.nu/p/1123758

## #8 — Jon, 2003-07-30T14:42Z

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
```

Permalänk: https://www.webforum.nu/p/1123771

## #9 — LarsG, 2003-07-30T15:11Z

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.)

Permalänk: https://www.webforum.nu/p/1123787

## #10 — Jon, 2003-07-31T09:21Z

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  :)

Permalänk: https://www.webforum.nu/p/1124259

## #11 — Jon, 2003-07-31T09:51Z

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
```

Permalänk: https://www.webforum.nu/p/1124279

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/82964-mer-problem-dubbla-relationer
