---
title: "knas med en inner join"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/136840-knas-med-en-inner-join"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Bjuris"
published: "2005-11-02T12:07:22.000Z"
updated: "2005-11-02T23:54:42.000Z"
replies: 8
views: 251
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/136840-knas-med-en-inner-join"
---

# knas med en inner join

## #1 — Bjuris, 2005-11-02T12:07Z

Jag har en sp enl. följande:

```
CREATE PROCEDURE sp_Roles
	@SystemID 	char (10),
	@UserId 	char (10)
AS
SELECT G.[Name] 
FROM Roles R
	Inner JOIN Groups G ON
		R.GroupID = G.GroupID
	Inner JOIN Users U ON
		R.UserID = @UserID AND R.SystemID = @SystemID
GO
```

 

Den hämtar data från en tabell, men som beror på två andra.
Problemet är att jag får tillbaka samma värde lika många gånder som antalet rader som finns i users.

I Roles så lagrar jag SystemID \| UserID \| GroupID
i Groups finns GroupID \| Name
i users:  SystemID \| UserID \| Password

Om det finns 12 användare så får jag tillbaka \[NAME\] 12 gånger, men i själva verket så finns det bara en rad som skall stämma överens.
 
Vad har jag gjort för fel?

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

## #2 — LarsG, 2005-11-02T13:20Z

Du ställer inga villkor på users och du hämtar heller inget från den så jag förstår inte varför den är med i frågan överhuvudtaget.

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

## #3 — Bjuris, 2005-11-02T13:56Z

Då sitter jag fast...

Hur skall jag skriva för att hämta ut alla roller som användaren är tilldelad?

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

## #4 — LarsG, 2005-11-02T14:13Z

```
SELECT G.[Name] 
from groups g
where groupid in 
  (select groupid 
    FROM Roles R
   where R.UserID = @UserID 
     AND R.SystemID = @SystemID)
```

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

## #5 — Bjuris, 2005-11-02T14:29Z

Det blir fortfarande så att jag får 12 records från frågan och det beror på att det finns 12 users...

Varje user är ju representerad i Roles, som i sin tur refererar till Groups..

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

## #6 — LarsG, 2005-11-02T14:54Z

Jag får inte ihop detta. Det har ingen betydelse hur många förekomster av ett groupid det finns i roles när man använder en subselect. kan du exemplifiera med datainnehåll och resultat och den exakta fråga du använder?

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

## #7 — Bjuris, 2005-11-02T15:17Z

Jag använder din fråga ovan.

när jag kör sp_Roles så hämtar den ut alla roller som skall finnas på den användaren och separerar dem med \|

ex1:

svaret jag får:
customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales\|
customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales\|customerDBSales

UserID = ALHA
SystemID = TDV

i tabellen user så finns ALHA & TDV en gång
i tabellen Roles finns ALHA & TDV en gång som refererar till GroupID = 3
i tabellen Groups så finns GroupID = 3 en gång och den pekar på customerDBSales

ex2:
customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|
customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin\|customerDBAdmin

UserID = DBUSER
SystemID = TDV

i tabellen user så finns DBUSER& TDV en gång
i tabellen Roles finns DBUSER& TDV två gång som refererar till GroupID = 2 & GroupID = 1
i tabellen Groups så finns GroupID = 1 en gång och den pekar på customerDBAdmin & GroupID = 2 en gång och den pekar på customerDBUser

När jag hämtar rollerna använder jag följande:

```
private String AssignRoles(string SystemId,String UserId)
{
	//Return a | separated list of roles this user is a member of
	int i;
	string strRoles="";
	ArrayList aList = new ArrayList();
	dg.ExecuteQuery("sp_GetRoles '" + SystemId + "', '" + UserId + "'", ref aList);
	for(i=0;i<aList.Count;i++)
	{
		ArrayList al= (ArrayList) aList[i]; // al is one row with index for each columns
		if(i>0)
			strRoles += "|";
		strRoles += ((string)al[0]).Trim();
	}
	return strRoles.Trim();
}
```

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

## #8 — Peter S, 2005-11-02T17:32Z

För att citera mig själv från en granntråd:

> **Peter S skrev:**
>
> Vad Lars menar med "datainnehåll" och "förväntat resultat", är att du skall posta exempelinnehåll från tabellen:
>
> ```
> id | name | address
> -------------------
> 1  | foo  | bar
> -------------------
> 2  | ...  | u.s.w.
> -------------------
> ```
>
> 
> Samt hur du förväntar dig att resultatet skall bli:
>
> ```
> id | name
> ---------
> 1  | foo 
> ---------
> 7  | faa 
> ---------
> 9  | ...
> ---------
> ```

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

## #9 — aasah, 2005-11-02T23:54Z

> **Bjuris skrev:**
>
> ...
>
> ```
> CREATE PROCEDURE sp_Roles
> 	@SystemID 	char (10),
> 	@UserId 	char (10)
> AS
> SELECT G.[Name] 
> FROM Roles R
> 	Inner JOIN Groups G ON
> 		R.GroupID = G.GroupID
> 	Inner JOIN Users U ON
> 		R.UserID = @UserID AND R.SystemID = @SystemID
> GO
> ```
>
>  I Roles så lagrar jag SystemID \| UserID \| GroupID
> i Groups finns GroupID \| Name
> i users:  SystemID \| UserID \| Password

Nu vet jag inte hur det fungerar att definiera procedurer, så det här kan vara helt uppåt väggarna galet... Men, jag tycker inte det ser ut som om du gör någon koppling till U. Borde du inte behöva skriva (i stil med):
...
CREATE PROCEDURE sp_Roles
	@SystemID 	char (10),
	@UserId 	char (10)
AS
SELECT G.\[Name\] 
FROM Roles R
	Inner JOIN Groups G ON
		R.GroupID = G.GroupID
	Inner JOIN Users U ON
                          **R.UserID = U.UserID AND R.SystemID = U.SystemID AND**  
		R.UserID = @UserID AND R.SystemID = @SystemID
GO

Hur vet den annars att U-värdena ska stämma med R-värdena?   :q

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/136840-knas-med-en-inner-join
