webForumDet fria alternativet

knas med en inner join

8 svar · 249 visningar · startad av Bjuris

BjurisMedlem sedan juli 2001514 inlägg
#1

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

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.

BjurisMedlem sedan juli 2001514 inlägg
#3

Då sitter jag fast...

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

LarsGMedlem sedan dec. 200012 464 inlägg
#4
SELECT G.[Name] 
from groups g
where groupid in 
  (select groupid 
    FROM Roles R
   where R.UserID = @UserID 
     AND R.SystemID = @SystemID)
BjurisMedlem sedan juli 2001514 inlägg
#5

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

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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?

BjurisMedlem sedan juli 2001514 inlägg
#7

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();
}
Peter SMedlem sedan dec. 20025 483 inlägg
#8

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  | ...
---------
aasahMedlem sedan mars 20034 471 inlägg
#9

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

124 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
120 ms — hämta tråd, inlägg och bilagor (db)