webForumDet fria alternativet
Logga in / Bli medlem

knas med en inner join

Databaser & SQL

8 svar · 251 visningar · startad av Bjuris

Medlem sedan juli 2001514 inlägg
Trådstart#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?

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

Medlem 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?

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

Medlem 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?

Medlem 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();
}
Medlem 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  | ...
---------
Medlem 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

263 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)