webForumDet fria alternativet

jämföra poster (förälder/barn-tabeller)

Databaser & SQL

13 svar · 308 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

Problemlösardags!
Har en tabell (Usertbl) med bla. kolumnen Userid.
Sen har jag en annan tabell (Relationtbl) med två kolumner,
Userid och Menuid, samt en relation mellan de två tabellerna
genom Userid, inget konstigt med detta alltså!

Nu vill jag jämföra Menuid i Relationtbl mellan två användare och
sedan få ett eof om de är identiska, hur skriver jag?

red/ gäller sql-2000server

Medlem sedan juni 20003 076 inlägg
#2

behöver lite hjälp här!
är lite inne på att använda intersect men får inte det att funka.

detta borde väl gå att få ihop:

Usertbl:
Userid=1
Userid=2

Relationtbl:
Userid=1
Menuid=1
Menuid=2

Userid=2
Menuid=1
Menuid=2

i detta exempel har alltså användare 1 och 2 samma menuid.

det är inte nödvändigt att få ett eof, bara jag kan få ut true/false på nått vis om användarna är lika.

Medlem sedan dec. 20003 887 inlägg
#3
SELECT Menuid FROM Relationtbl
WHERE Menuid NOT IN
  (SELECT Menuid FROM Relationtbl WHERE Userid = 2)
AND Userid = 1

Denna fråga borde ge dig ett EOF om båda användarna har samma Menuid:n

Medlem sedan juni 20003 076 inlägg
#4

hmm, har inte testat men blir det inte fel?
om användare 1 har menuid 1 och 2 samt
att användare 2 har menuid 1,2 och 3.
då får jag väl ett eof då också, eller?

Medlem sedan dec. 20003 887 inlägg
#5

Sant... det går väl att utöka det hela iofs...

SELECT Menuid FROM Relationtbl
WHERE Menuid NOT IN
  (SELECT Menuid FROM Relationtbl WHERE Userid = 2)
AND Userid = 1
GROUP BY Menuid
HAVING Count(*) = (SELECT Count(*) FROM Relationtbl Userid = 2)

Nu är jag inget vidare på det här med group by, men du kan ju testa och se om det fungerar :)

Medlem sedan dec. 200012 464 inlägg
#6

Det hade varot lättare om SQL server hade haft stöd för except eller minus.

select distinct 1 from relationtbl r1
  where (select count(*) 
           from relationtbl r1, relationtbl r2
          where r1.userid = 1 and r2.userid = 2
            and r1.menuid = r2.menuid) = 
        (select count(*) from relationtbl
          where userid = 1)
   and (select count(*) from relationtbl
          where userid = 1) =
       (select count(*) from relationtbl
          where userid = 2)
Medlem sedan juni 20003 076 inlägg
#7

jag får inte någon av era koder att fungera. :(
själv är jag inne på denna, jag tycker att den borde funka, eller?

if (select count(menuid) from Relationtbl where Userid = 1) =
(select count(menuid) from Relationtbl where Userid = 2)

SELECT menuid from Relationtbl Where Userid = 1
And Menuid Not In
(SELECT menuid from Relationtbl Where Userid = 2)

men när jag sedan kör koden får jag:
Operation is not allowed when the object is closed.

[b]if rs.eof then[/b]
response.write "ok"
else
response.write "tok"
end if
set rs = nothing

varför får jag denna felkod?
jag provade också att sätta en if-tagg på om rs är ett objekt och det är det.

Medlem sedan juni 200032 967 inlägg
#8

Har du verkligen exekverat SQL-frågan? Om man glömt att göra rs.open strSQL, blah brukar man kunna få den sortens fel.

Medlem sedan juni 20003 076 inlägg
#9

jo då, jag kör sql-frågan, som jag skrev, rs är ett objekt! :)
kan det vara nått med if-taggen i sql-strängen?
om inte första delen i strängen är lika så körs ju inte den undre delen.

Medlem sedan juni 200032 967 inlägg
#10

doggelito skrev:

jo då, jag kör sql-frågan, som jag skrev, rs är ett objekt! :)

Det är inte samma sak. Eftersom man ofta skapar recordset med set objRS = Server.CreateObject("ADODB.RecordSet") så är det inte ovanligt att man har recordsetobjekt som skapade och giltiga, men som inte har öppnats, därav min fråga.

doggelito skrev:

kan det vara nått med if-taggen i sql-strängen?

Det har jag svårt att tänka mig. Fungerar asp-koden och din EOF-kontroll om du bara byter ut SQL-frågan till något elementärt?

doggelito skrev:

om inte första delen i strängen är lika så körs ju inte den undre delen.

Sant. Du kan ju prova att lägga till en else-sats i SQL-frågan också, så en SELECT alltid utförs.

Har du möjlighet att köra frågan i något annat verktyg, exempelvis Enterprise Manager?

(Jag vet alltså inte om den fråga du skrev i ditt tidigare inlägg är helt korrekt, men det borde kunna fungera.)

Medlem sedan juni 20003 076 inlägg
#11

@nders skrev:

Det är inte samma sak. Eftersom man ofta skapar recordset med...

det är ju sant förståss! jag kör dock alltid med en function som sköter öppningen av recordsetet så nog kör den sql-strängen allt.

@nders skrev:

Det har jag svårt att tänka mig. Fungerar asp-koden och din EOF-kontroll om du bara byter ut SQL-frågan till något elementärt?

ja!

@nders skrev:

Sant. Du kan ju prova att lägga till en else-sats i SQL-frågan också, så en SELECT alltid utförs.

ska testa det!

Medlem sedan juni 20003 076 inlägg
#12

tror jag hittade den fiffigaste koden! (om den nu är korrekt och om ingen skriver en smidigare förståss!)

if exists( 
	SELECT menuid from Relationtbl Where Userid = 1
	And Menuid Not In
	(SELECT menuid from Relationtbl Where Userid = 2))
	select 1 

else 
	if exists(

	SELECT menuid from Relationtbl Where Userid = 2
	And Menuid Not In
	(SELECT menuid from Relationtbl Where Userid = 1))
	select 1 

	else

	select 0

dock problem kvarstår:
i query analyzer stämmer svaren jag får men skriver jag response.write(rs(0)) på asp-sidan får jag alltid 1 tillbaka, vad kan detta bero på då? kan man inte använda rs(0) med denna sql-sträng?

Medlem sedan juni 20003 076 inlägg
#13

help please!
varför får jag bara ut 1 som värde på asp-sidan, inga ideér?
kan man skriva om sql-strängen så man verkligen får 1 eller 0 som resultat, om nu inte ovan är korrekt?

Medlem sedan juni 20003 076 inlägg
#14

va trött jag blir :x slarvfel! koden funkar.

389 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
123 ms — hämta statistik (db)
134 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)