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
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.
Engine^Medlem sedan dec. 20003 887 inläggSELECT 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
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?
Engine^Medlem sedan dec. 20003 887 inläggSant... 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 :)
LLarsGMedlem sedan dec. 200012 464 inlägg 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)
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.
@ndersMedlem sedan juni 200032 967 inläggHar du verkligen exekverat SQL-frågan? Om man glömt att göra rs.open strSQL, blah brukar man kunna få den sortens fel.
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.
@ndersMedlem sedan juni 200032 967 inlägg
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.)
@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!
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?
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?
va trött jag blir :x slarvfel! koden funkar.