webForumDet fria alternativet

Where exists... + Union

Databaser & SQLur Databashanterare & SQL

6 svar · 211 visningar · startad av Eclipse

Medlem sedan juli 20003 825 inlägg
Frågan#1
' ## SELECT NAVIGATION PER MENU
SQL = " SELECT n.intID, n.strName, 'TRUE', m.intID, m.strName, a.intID, u.intID " _
& " FROM navigation n, navigationMenu m, access a, users u " _
& " WHERE EXISTS " _ 
& " (SELECT a.intID, u.intID, n.intID, m.intID FROM access a, users u, navigation n, navigationMenu m WHERE " _
& " u.intID = " & request("ID") & " AND  u.intID = a.intUserID AND " _
& " a.intNavigationID = n.intID AND n.intMenuID = m.intID ) " _
& " UNION " _
& " SELECT n.intID, n.strName, 'FALSE', m.intID, m.strName, a.intID, u.intID " _
& " FROM navigation n, navigationMenu m, access a, users u " _
& " WHERE NOT EXISTS " _
& " (SELECT a.intID, u.intID, n.intID, m.intID FROM access a, users u, navigation n, navigationMenu m WHERE " _
& " u.intID = " & request("ID") & " AND u.intID = a.intUserID AND " _
& " a.intNavigationID = n.intID AND n.intMenuID = m.intID );"

set mySQL = Conn.Execute(SQL)
listNavigation = mySQL.GetRows()

Någon som ser ett uppenbart fel!?

Jag har testat olika varianter och denna variantern mer eller mindre sänker servern...

Medlem sedan mars 20034 471 inlägg
#2

Re: Where exists... + Union

enbart SQL:n skrev:

' ## SELECT NAVIGATION PER MENU
SELECT n.intID, n.strName, 'TRUE', m.intID, m.strName, a.intID, u.intID
FROM navigation n, navigationMenu m, access a, users u
WHERE EXISTS
(SELECT a.intID, u.intID, n.intID, m.intID FROM access a, users u, navigation n, navigationMenu m
WHERE u.intID = " & request("ID") & " AND u.intID = a.intUserID AND a.intNavigationID = n.intID AND n.intMenuID = m.intID )
UNION
SELECT n.intID, n.strName, 'FALSE', m.intID, m.strName, a.intID, u.intID
FROM navigation n, navigationMenu m, access a, users u
WHERE NOT EXISTS
(SELECT a.intID, u.intID, n.intID, m.intID FROM access a, users u, navigation n, navigationMenu m
WHERE u.intID = " & request("ID") & " AND u.intID = a.intUserID AND
a.intNavigationID = n.intID AND n.intMenuID = m.intID );

Ska det röda &:et vara där?

Jag tycker det ser skumt ut, det borde bli syntaxfel???
Du har:

.... 
(SELECT a.intID, u.intID, n.intID, m.intID FROM ....
   UNION 
SELECT n.intID, n.strName, 'FALSE', m.intID, m.strName, a.intID, u.intID FROM ...

I den översta Selectsatsen plockar du ut 4 attribut att slå ihop med 7 attribut nedan! Eftersom en union slår ihop tabellerna på "höjden" borde det inte funka alls om du inte har lika många kolumner i bägge uttrycken och dessutom att kolumnerna har samma typ.

Sedan är det inte konstigt om det går segt. Dina joiner, som du har flera av, är mycket stora, dessutom har du många mängdoperationer, vilka tar mycket resurser.

Medlem sedan dec. 200012 464 inlägg
#3

Vad vill du ha för resultat? (Alltså inte den dubbla kryssprodukt som du försöker ta fram nu.)

Vissa lite exempel data och förväntat resultat.

Medlem sedan juli 20003 825 inlägg
#4

aasah : --> Just det tecknet är korrekt.

***
Jag vill att alla menyvl ska listas samt en TRUE eller en FALSE till dom man hgar behörighet till.

Jag har aldrig riktigt fattat Union men jag ska kolla din beskrivning ovan och se om jag närmar mig sanningen.

Medlem sedan juli 20003 825 inlägg
#5

Denna koden fungerar:

' ## SELECT SUBSCRIBERS PER TEMPLATE
SQL = " SELECT t.intID, t.strName, 'TRUE', ( SELECT count(*) FROM subscribers s WHERE s.intTemplateID = t.intID ) " _
& " FROM listTemplate t " _
& " WHERE EXISTS " _ 
& " (SELECT s.intID FROM subscribers s, users u WHERE s.intUserID = u.intID " _
& " AND s.intTemplateID = t.intID AND u.intID = " & request("ID") & ") " _
& " UNION " _
& " SELECT t.intID, t.strName, 'FALSE', ( SELECT count(*) FROM subscribers s WHERE s.intTemplateID = t.intID ) " _
& " FROM listTemplate t " _
& " WHERE NOT EXISTS " _
& " (SELECT s.intID FROM subscribers s, users u WHERE s.intUserID = u.intID " _
& " AND s.intTemplateID = t.intID AND u.intID = " & request("ID") &");"
Medlem sedan juli 20003 825 inlägg
#6

[users] --> u
intID

[access] --> a
intID
intUserID
intNavigationID

[navigation] --> n
intID
intMenuID

[navigationMenu] --> m
intID

Fungerande kod:

' ## SELECT NAVIGATION PER MENU
SQL = " SELECT n.intID, n.strName, 'TRUE' " _
& " FROM navigation n " _
& " WHERE EXISTS " _ 
& " (SELECT a.intID FROM access a, users u WHERE " _
& " u.intID = " & request("ID") & " AND  u.intID = a.intUserID AND " _
& " a.intNavigationID = n.intID ORDER BY n.intSortfield ) " _
& " UNION " _
& " SELECT n.intID, n.strName, 'FALSE'" _
& " FROM navigation n " _
& " WHERE NOT EXISTS " _
& " (SELECT a.intID FROM access a, users u WHERE " _
& " u.intID = " & request("ID") & " AND u.intID = a.intUserID AND " _
& " a.intNavigationID = n.intID ORDER BY n.intSortfield );"

Se bifogad bild:
Där det nu står siffror (id nummer) vill jag att det ska stå navigationMenu.strName. (Se tidigare kod!)

SQL = " SELECT n.intID, n.strName, 'TRUE', m.intID, m.strName " _

Medlem sedan juli 20003 825 inlägg
#7

Den bifogade filen försvann visst på vägen.

verktyget2.gif
134 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)