[SQL] WHERE .. mits de tabel niet leeg is..

Pagina: 1
Acties:
  • 302 views sinds 30-01-2008
  • Reageer

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
tja, vervolg op [topic=348588/1/75] maar andere strekking..:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
strSQL=    "SELECT *"

strSQL=strSQL & "FROM"
strSQL=strSQL & "     TblTotaaloverzichtprojectsheets,"
strSQL=strSQL & "     TblKeuze," 
strSQL=strSQL & "     TblBusinessType,"
strSQL=strSQL & "     TblProjectGoal,"
strSQL=strSQL & "     TblStrategyType,"
strSQL=strSQL & "     TblProcessFocus,"
strSQL=strSQL & "     TblEvolutionType"

strSQL=strSQL & " WHERE"
strSQL=strSQL & "   TblTotaaloverzichtprojectsheets.ProID = 1"
strSQL=strSQL & " AND  TblKeuze.ProID = 1" 
strSQL=strSQL & " AND  TblKeuze.[Business TypeID] = TblBusinessType.[Business TypeID]"
strSQL=strSQL & " AND  TblKeuze.[Process FocusID] = TblProcessFocus.[Process FocusID]"
strSQL=strSQL & " AND  TblKeuze.[Project GoalID] = TblProjectGoal.[Project GoalID]"
strSQL=strSQL & " AND  TblKeuze.[Strategy TypeID] = TblStrategyType.[Strategy TypeID]"
strSQL=strSQL & " AND  TblKeuze.[Evolution TypeID] = TblEvolutionType.[Evolution TypeID]"

tm strategy type tabel werkt de query prima, maar nu is het zo dat TblEvolutionType nog leeg is, en dus, als je het in zo'n query propt, krijg je een lege recordset terug :'(

kan ik niet iets doen als:
code:
1
IIF(IsNull(TblEvolutionType);;AND TblKeuze.[Evolution TypeID] = TblEvolutionType.[Evolution TypeID])

zal wel niet maar je snapt wat ik bedoel :)

  • Onno
  • Registratie: Juni 1999
  • Niet online
Gebruik een outer join. En ik heb geen idee hoe je dat in Access doet. :)

Verwijderd

Op dinsdag 18 december 2001 12:28 schreef Onno het volgende:
Gebruik een outer join. En ik heb geen idee hoe je dat in Access doet. :)
Inner join geeft resultaten waarbij gegevens uit beide tabellen overeenkomen.
Outer join geeft resultaten waarbij gegevens uit beide tabellen NIET overeenkomen (gegevens uit tabel A mogen niet in tabel B voorkomen!).

Outer join is dus geen optie. Gebruik in dit geval left of right join. En ja, die zijn gewoon mogelijk m.b.v. Access.

Verwijderd

Je wilt een AND op een expressie loslaten die NOOIT slaagt, want het veld is leeg. Dat is dus niet oplosbaar.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 18 december 2001 12:35 schreef hvdberg het volgende:
Gebruik in dit geval left of right join.
Dat zijn outer joins. :+

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
Op dinsdag 18 december 2001 12:37 schreef Otis het volgende:
Je wilt een AND op een expressie loslaten die NOOIT slaagt, want het veld is leeg. Dat is dus niet oplosbaar.
ja maar deze tabel moet wel opgenomen in de query, is dan de enige oplossing het vullen van de tabel? want zodra er wel wat in de tabel staat dan doettie het verder wel

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Mneej, dan moet je dus een LEFT JOIN ofzow gebruiken... De syntax weet ik alleen niet uit mijn hoofd, kan je vast wel ergens op t net vinden.

Rustacean


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
wat is het nou, left, right of outer join :? jullie zeggen allemaal iets anders :P

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 18 december 2001 12:35 schreef hvdberg het volgende:
Outer join is dus geen optie. Gebruik in dit geval left of right join. En ja, die zijn gewoon mogelijk m.b.v. Access.
Leg dan ook uit waarom dit in Oracle met een Outer Join opgelost "moet" worden? ;)
Oracle kent geen LEFT/RIGHT Join's (en volgens mij het hele statement Join niet?)...

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 18 december 2001 12:50 schreef ACM het volgende:
Oracle kent geen LEFT/RIGHT Join's
Oracle kent het verschil tussen left en right ook wel, alleen wordt dat op een veel natuurlijkere manier aangegeven. Met een (+) op de juiste plek. :)

(left en right zijn allebei gewoon outer joins)

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Bij Oracle gebruik je een (+) ofzow om te joinen d8 ik, in MySQL moet je gewoon LEFT JOIN en dan een of andere vage syntax.

En LEFT en RIGHT joins zijn allebei outer, dus we zeggen toch hetzelfde.

Rustacean


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
mmkay.. nou bij access is het dus INNER óf OUTER, en aangezien ik een joinrookie ben > wat join ik met wat en hoe? als ik een INNER JOIN doe op de eerste 2 tabellen:
code:
1
2
3
SELECT * 
FROM TblTotaaloverzichtprojectsheets 
  INNER JOIN TblKeuze ON TblTotaaloverzichtprojectsheets.ProID = TblKeuze.ProID

dan werkt het precies hetzelfde als hoe ik het eerst had.

zou ik dan al die kleinere tabellen moeten joinen met TblKeuze ? Hoe doe je dat eigenlijk, meerdere tabellen joinen

  • thijsc
  • Registratie: Augustus 2000
  • Laatst online: 22-12-2023
Zet anders voortaan je query neer in plaats van dat hele ASP string gebeuren.

Leest wat makkelijker

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
Op dinsdag 18 december 2001 13:17 schreef thijsc het volgende:
Zet anders voortaan je query neer in plaats van dat hele ASP string gebeuren.

Leest wat makkelijker
:? en anders..... dan geef je geen nuttige input?

doe anders even on-topic, leest wat minder.

Sorry dat ik het zeg maar zo on overzichtelijk is het nou ook weer niet lijkt me, denk de eerste 17 en de laatste char(s) weg.. staat nog netjes uitgelijnd ook.

Verwijderd

Op dinsdag 18 december 2001 12:50 schreef ACM het volgende:

[..]

Leg dan ook uit waarom dit in Oracle met een Outer Join opgelost "moet" worden? ;)
Oracle kent geen LEFT/RIGHT Join's (en volgens mij het hele statement Join niet?)...
Beetje tegensprekend... In Oracle moet dit opgelost worden met Outer Join en even later zeg je dat joins sowieso niet lukken in Oracle? Vreemd, maar goed.

Ik zal aan de hand van vb. uitleggen wat ik met inner/outer/left/right joins bedoel:

Tabel A bestaat uit ID en Naam.
Waarden tabel A:
ID Naam
-----------
1 Pietje Puk
2 Meneer de Uil
3 Kortjakje

Tabel B bestaat uit ID, A_ID en produkt.
Waarden tabel B:
ID A_ID Produkt
-------------------------
1 0 Prd1
2 0 Prd2
3 1 Prd3
4 2 Prd4
5 2 Prd5
6 3 Prd6
7 3 Prd7
4 3 Prd8

Nu gaan we de tabellen met verschillende queries koppelen:
Statement 1:
SELECT B.Produkt, A.Naam
FROM A, B
WHERE B.A_ID=A.ID

Dit geeft het volgende resultaat:
Produkt Naaam
-----------------
Prd3 Pietje Puk
Prd4 Meneer de Uil
Prd5 Meneer de Uil
Prd6 Kortjakje
Prd7 Kortjakje
Prd8 Kortjakje

Statement 2:
SELECT B.Produkt, A.Naam
FROM A INNER JOIN B ON B.A_ID=A.ID

Dit geeft het volgende resultaat:
Produkt Naaam
-----------------
Prd3 Pietje Puk
Prd4 Meneer de Uil
Prd5 Meneer de Uil
Prd6 Kortjakje
Prd7 Kortjakje
Prd8 Kortjakje

Statement 3:
SELECT B.Produkt, A.Naam
FROM A OUTER JOIN B ON B.A_ID=A.ID

Dit geeft het volgende resultaat:
Produkt Naaam
-----------------
Prd1
Prd2

Statement 4:
SELECT B.Produkt, A.Naam
FROM B LEFT JOIN A ON B.A_ID=A.ID

Dit geeft het volgende resultaat:
Produkt Naaam
-----------------
Prd1
Prd2
Prd3 Pietje Puk
Prd4 Meneer de Uil
Prd5 Meneer de Uil
Prd6 Kortjakje
Prd7 Kortjakje
Prd8 Kortjakje

Statement 5:
SELECT B.Produkt, A.Naam
FROM B RIGHT JOIN A ON B.A_ID=A.ID

Dit geeft het volgende resultaat:
Produkt Naaam
-----------------
Prd3 Pietje Puk
Prd4 Meneer de Uil
Prd5 Meneer de Uil
Prd6 Kortjakje
Prd7 Kortjakje
Prd8 Kortjakje


Alle bovengenoemde statements kunnen fout zijn aangezien ik ze gewoon uit het blote hoofdje doe. :*

Even kijken in de Access helpfile zal hier waarschijnlijk meer duidelijkheid over scheppen!

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 18 december 2001 13:26 schreef hvdberg het volgende:
Beetje tegensprekend... In Oracle moet dit opgelost worden met Outer Join en even later zeg je dat joins sowieso niet lukken in Oracle? Vreemd, maar goed.
Nee, je leest niet goed. Hij zegt niet dat Oracle niet aan joins doet, hij zegt dat Oracle het keyword 'JOIN' niet kent. En dat klopt.

Verwijderd

Op dinsdag 18 december 2001 13:31 schreef Onno het volgende:

[..]

Nee, je leest niet goed. Hij zegt niet dat Oracle niet aan joins doet, hij zegt dat Oracle het keyword 'JOIN' niet kent. En dat klopt.
Ik ken geen Oracle, vandaar, maar zoals ik het las:
[citaat]
Leg dan ook uit waarom dit in Oracle met een Outer Join opgelost "moet" worden?
[/citaat]
Hij spreekt hier over een outer join. Die kun je ten alle tijde herleiden naar een WHERE-statement in een query. Maar in mijn optiek (en dat is dan puur mijn optiek, hoeft het hier niet mee eens te zijn), spreekt hij hier over het JOIN statement. En die bestaan niet in Oracle! Vandaar dat ik het een beetje tegensprekend vond maar dat is dus meer een taalkundige/interpretatie kwestie imho.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 18 december 2001 13:38 schreef hvdberg het volgende:
Leg dan ook uit waarom dit in Oracle met een Outer Join opgelost "moet" worden?
Dat moet in elke database, alleen jouw begrip over wat een outer join is klopt niet.

Wat jij left en right joins noemt zijn allebei outer joins.

Je had 't over de Access help.. prima, quote uit de Access help:
outer join

Een verbinding waarin elke overeenkomende record uit twee tabellen wordt gecombineerd tot één record in de resultaatset van de query. Als echter een record uit een tabel waaruit alle records worden geselecteerd, niet overeenkomt met een record uit de andere tabel, wordt die record toch in de resultaatset van de query opgenomen, maar zijn de cellen leeg omdat er geen overeenkomende record in de andere tabel is gevonden.
Dat is dus niet wat jij als outer join ziet.
Hij spreekt hier over een outer join. Die kun je ten alle tijde herleiden naar een WHERE-statement in een query.
Niet in elke database. Alleen met inner joins kan dat altijd.
Maar in mijn optiek (en dat is dan puur mijn optiek, hoeft het hier niet mee eens te zijn), spreekt hij hier over het JOIN statement.
Het is geen statement maar een keyword. En hij zegt dat het met een outer join opgelost moet worden, dat klopt toch? Het concept outer join bestaat in Oracle wel. Dat keyword alleen niet.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Wat een discussie zeg.
Onno heeft in z'n eerste reply al gelijk. Gewoon een outer oin gebruiken.
Zullen we nu stoppen met het topic. Het ding blijft maar naar boven komen. Weet je niet wat een outer join zoek het dan eerst even ergens op.

Verwijderd

Dat moet in elke database, alleen jouw begrip over wat een outer join is klopt niet.
Zou idd. kunnen, 't is al een tijdje geleden hoor! Bovendien werk ik de laatste tijd alleen met SQL Server en misschien is daar mijn uitleg wel op gebaseerd. En daar zal ik waarschijnlijk wel fouten in maken ja. Maar 'k probeer alleen maar aan te geven waar hij 't misschien kan zoeken.
Wat jij left en right joins noemt zijn allebei outer joins.

Je had 't over de Access help.. prima, quote uit de Access help:
Ik had zelf geen Access bij de hand anders had ik hem zelf gepost! Bedankt.
Dat is dus niet wat jij als outer join ziet.
Zoals ik al zei, kan idd. zo zijn.
Niet in elke database. Alleen met inner joins kan dat altijd.
Met SQL Server en SQL Monitor gekeken en iedere JOIN (Inner/Outer) werd vertaald naar een WHERE! Zelf getest maar 'k heb nog geen JOIN's gezien welke niet vertaald kon worden naar een WHERE.
Het is geen statement maar een keyword. En hij zegt dat het met een outer join opgelost moet worden, dat klopt toch? Het concept outer join bestaat in Oracle wel. Dat keyword alleen niet.
Jep, ik typte/poste misschien wat te snel. Doet echter voor de rest niet zo veel af van de rest van mijn bedoeling; no flame intended.

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Misschien heeft SQLServer ook iets als een (+)-je, in MySQL kan je sowieso geen outer joins doen in de WHERE.

Rustacean


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 18 december 2001 13:56 schreef Manuzhai het volgende:
Misschien heeft SQLServer ook iets als een (+)-je,
Jup. Je kunt *= en =* gebruiken in een WHERE clause om hetzelfde mee aan te geven als de (+) in Oracle.

(tenminste, in Sybase.. en aangezien MSSQL van Sybase afgeleid is zal het daarin ook wel zo werken)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 18 december 2001 13:54 schreef hvdberg het volgende:
Jep, ik typte/poste misschien wat te snel. Doet echter voor de rest niet zo veel af van de rest van mijn bedoeling; no flame intended.
Dat komt dan waarschijnlijk omdat ik het al een "statement" noemde :)

Excuses daarvoor, had keyword moeten staan.

Verwijderd

Op dinsdag 18 december 2001 14:08 schreef Onno het volgende:

[..]

Jup. Je kunt *= en =* gebruiken in een WHERE clause om hetzelfde mee aan te geven als de (+) in Oracle.

(tenminste, in Sybase.. en aangezien MSSQL van Sybase afgeleid is zal het daarin ook wel zo werken)
Transact-SQL Joins
In earlier versions of Microsoft® SQL Server 2000, left and right outer join conditions were specified in the WHERE clause using the *= and =* operators. In some cases, this syntax results in an ambiguous query that can be interpreted in more than one way. SQL-92 compliant outer joins are specified in the FROM clause and do not result in this ambiguity. Because the SQL-92 syntax is more precise, detailed information about using the old Transact-SQL outer join syntax in the WHERE clause is not included with this release. The syntax may not be supported in a future version of SQL Server. Any statements using the Transact-SQL outer joins should be changed to use the SQL-92 syntax.

The SQL-92 standard does support the specification of inner joins in either the FROM or WHERE clause. Inner joins specified in the WHERE clause do not have the same problems with ambiguity as the Transact-SQL outer join syntax.

-----
Hiermee geven ze dus aan dat SQLServer 2000 die lelijke statements niet meer ondersteunt.

Men zou dus iets moeten doen als
SELECT * FROM (TABLE LEFT JOIN TABLE2 ON TABLE.bla = TABLE2.bla) LEFT JOIN TABLE3 ON (TABLE1.reutel = TABLE3.reutel) ETC.

Wordt een aardige lijst voor topicstarter zn query, maar wel zo netjes.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 18 december 2001 13:31 schreef Onno het volgende:
Nee, je leest niet goed. Hij zegt niet dat Oracle niet aan joins doet, hij zegt dat Oracle het keyword 'JOIN' niet kent. En dat klopt.
offtopic:
Inmiddels wordt dit wel ondersteund (in Oracle 9i).

Who is John Galt?


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
Op dinsdag 18 december 2001 14:47 schreef Otis het volgende:

[..]

Men zou dus iets moeten doen als
SELECT * FROM (TABLE LEFT JOIN TABLE2 ON TABLE.bla = TABLE2.bla) LEFT JOIN TABLE3 ON (TABLE1.reutel = TABLE3.reutel) ETC.

Wordt een aardige lijst voor topicstarter zn query, maar wel zo netjes.
shoot me dat ik blijf doorzagen maar ook met deze inner join:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT * FROM
   TblTotaaloverzichtprojectsheets INNER JOIN
    (TblWebsiteType INNER JOIN
       (TblBusinessType INNER JOIN
        (TblEvolutionType INNER JOIN
           (TblExterneRealisatie INNER JOIN
            (TblInitiator INNER JOIN
               (TblPartnerBijRealisatie INNER JOIN
                (TblProcessFocus INNER JOIN
                   (TblProjectGoal INNER JOIN
                    (TblSoftwareUsed INNER JOIN
                       (TblStrategyType INNER JOIN
                        (TblTemplate INNER JOIN TblKeuze ON TblTemplate.TemplateID = TblKeuze.TemplateID)
                        ON TblStrategyType.[Strategy TypeID] = TblKeuze.[Strategy TypeID])
                       ON TblSoftwareUsed.[Software UsedID] = TblKeuze.[Software UsedID])
                    ON TblProjectGoal.[Project GoalID] = TblKeuze.[Project GoalID])
                   ON TblProcessFocus.[Process FocusID] = TblKeuze.[Process FocusID])
                ON TblPartnerBijRealisatie.[Partner bij realisatieID] = TblKeuze.[Partner bij realisatieID])
               ON TblInitiator.InitiatorID = TblKeuze.InitiatorID)
            ON TblExterneRealisatie.[Externe realisatieID] = TblKeuze.[Externe realisatieID])
           ON TblEvolutionType.[Evolution TypeID] = TblKeuze.[Evolution TypeID])
        ON TblBusinessType.[Business TypeID] = TblKeuze.[Business TypeID])
       ON TblWebsiteType.[Website TypeID] = TblKeuze.[Website TypeID])
    ON TblTotaaloverzichtprojectsheets.ProID = TblKeuze.ProID
WHERE TblTotaaloverzichtprojectsheets.ProID = 1

werkt het nog niet, ik krijg bij record 1 wel netjes de lijst terug, omdat ik daar handmatig overal een bestaand id heb ingevuld, maar pak ik een id nr waar 1 of 2 idnr's ontbreken, dan werktie dus nog steeds niet (heb dus nog steeds het zelfde resultaat als in de bovenste post). :'(

ps. misschien niet helemaal het zelfde als hoe Otis het schrijft, maar daar kan ik geen hout aan vast knopen :) dus heb maar ff een sample van 4GuysFromRolla.com gebruikt.

Verwijderd

Door oZy - dinsdag 18 december 2001 15:52

--------------------------------------------------------------------------------

quote:
--------------------------------------------------------------------------------
Op dinsdag 18 december 2001 14:47 schreef Otis het volgende:
[..]

Men zou dus iets moeten doen als
SELECT * FROM (TABLE LEFT JOIN TABLE2 ON TABLE.bla = TABLE2.bla) LEFT JOIN TABLE3 ON (TABLE1.reutel = TABLE3.reutel) ETC.

Wordt een aardige lijst voor topicstarter zn query, maar wel zo netjes.


--------------------------------------------------------------------------------

shoot me dat ik blijf doorzagen maar ook met deze inner join:
code:
--------------------------------------------------------------------------------
SELECT * FROM
TblTotaaloverzichtprojectsheets INNER JOIN
(TblWebsiteType INNER JOIN
(TblBusinessType INNER JOIN
(TblEvolutionType INNER JOIN
(TblExterneRealisatie INNER JOIN
(TblInitiator INNER JOIN
(TblPartnerBijRealisatie INNER JOIN
(TblProcessFocus INNER JOIN
(TblProjectGoal INNER JOIN
(TblSoftwareUsed INNER JOIN
(TblStrategyType INNER JOIN
(TblTemplate INNER JOIN TblKeuze ON TblTemplate.TemplateID = TblKeuze.TemplateID)
ON TblStrategyType.[Strategy TypeID] = TblKeuze.[Strategy TypeID])
ON TblSoftwareUsed.[Software UsedID] = TblKeuze.[Software UsedID])
ON TblProjectGoal.[Project GoalID] = TblKeuze.[Project GoalID])
ON TblProcessFocus.[Process FocusID] = TblKeuze.[Process FocusID])
ON TblPartnerBijRealisatie.[Partner bij realisatieID] = TblKeuze.[Partner bij realisatieID])
ON TblInitiator.InitiatorID = TblKeuze.InitiatorID)
ON TblExterneRealisatie.[Externe realisatieID] = TblKeuze.[Externe realisatieID])
ON TblEvolutionType.[Evolution TypeID] = TblKeuze.[Evolution TypeID])
ON TblBusinessType.[Business TypeID] = TblKeuze.[Business TypeID])
ON TblWebsiteType.[Website TypeID] = TblKeuze.[Website TypeID])
ON TblTotaaloverzichtprojectsheets.ProID = TblKeuze.ProID
WHERE TblTotaaloverzichtprojectsheets.ProID = 1
Is niet een beetje anders maar heel anders dan wat Otis bedoeld. Jij gebruikt inner joins, Otis left joins.
Hierbij heb ik je query verder niet bekeken (was me veel te lange tekst), sorry for that...

Verwijderd

idd, je moet niet INNER JOIN's gebruiken maar LEFT JOINS.

SELECT * FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.bla=TABLE2.bla

geeft alle records van TABLE1 (1 of meerdere keren, al naargelang hoeveel matches er zijn tussen TABLE1.bla en TABLE2.bla) met daaraan vast alle velden van TABLE2. Die velden zijn NULL als er geen relatie wordt gevonden tussen TABLE1 en TABLE2 op basis van het huidige TABLE1 record en ze zijn gevuld met de waarden van een TABLE2 record dat de expressie TABLE1.bla = TABLE2.bla waar maakt.

Gebruik je een INNER JOIN, dan krijg je NIET de records waar de velden voor TABLE2 NULL zijn. In jouw geval zijn die velden NULL (want leeg) dus worden die records genegeerd. Helaas geldt dit voor alle records, waardoor je query 0 rows oplevert. Als je de INNER JOIN's vervangt door LEFT JOIN's werkt je query wel.

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
Otis:
Als je de INNER JOIN's vervangt door LEFT JOIN's werkt je query wel.
code:
1
2
3
Microsoft JET Database Engine error '80040e14' 

Join expression not supported.

*...zugt....*

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
je kan toch ook gewoon in access de query mooi visueel opbouwen en daarna gewoon die sql kopieren naar je script :? Dat werkte bij mij altijd perfect op die gekke access-sql te maken.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 17:11 schreef oZy het volgende:

[..]
code:
1
2
3
Microsoft JET Database Engine error '80040e14' 

Join expression not supported.

*...zugt....*
Als je alles nou eens deed zoals in je eerste query, alleen voor de laatste tabel een left join in from clause opneemt, dan lukt het misschien wel

Verwijderd

Op dinsdag 18 december 2001 15:52 schreef oZy het volgende:
shoot me dat ik blijf doorzagen maar ook met deze inner join:
Als je 12 (!) joins nodig hebt, zou ik 's heel erg kritisch naar 't datamodel kijken. Dit kun je geen enkele database aandoen en dan ook nog verwachten dat 'ie een beetje performt...

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 21:19 schreef Afterlife het volgende:

[..]

Als je 12 (!) joins nodig hebt, zou ik 's heel erg kritisch naar 't datamodel kijken. Dit kun je geen enkele database aandoen en dan ook nog verwachten dat 'ie een beetje performt...
MIS. het db-ontwerp lijkt goed.
Een centrale tabel met een stuk op 10 code-tabellen er om heen. Niets mis mee.
Een professioneel RDBMS heeft hier helemaal geen moeite mee

Verwijderd

Op dinsdag 18 december 2001 21:22 schreef Goodielover het volgende:
MIS. het db-ontwerp lijkt goed.
Een centrale tabel met een stuk op 10 code-tabellen er om heen. Niets mis mee.
Ontwerp is zo te zien idd goed, maar je wilt geen 12 joins in 1 query, ook al bestaan 10 van de 12 uit "picklist" type joins.
Een professioneel RDBMS heeft hier helemaal geen moeite mee
Echt wel, zeker wanneer je je indexes niet optimaal definieert of de join volgorde niet optimaliseert.
Bovendien is dit een situatie waarbij je vele honderden procenten wint door die 10 "picklist" tabellen client side te cachen.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 22:00 schreef Afterlife het volgende:
[...]
Echt wel, zeker wanneer je je indexes niet optimaal definieert of de join volgorde niet optimaliseert.
[...]
Ja hehe, als ik niet goed ben met databases, maak ik er een zooitje van.
Afhankelijk van de grootte van de codetabellen zal een index helemaal niet nodig zijn.

Verwijderd

Je vergat nog een stukje te quoten:
Bovendien is dit een situatie waarbij je vele honderden procenten wint door die 10 "picklist" tabellen client side te cachen.

Verwijderd

'client side cachen' ? Je bedoelt in de gui in je dropdown listjes oid? :) Want voor de rest heb je geen moer aan client side cached data (wat het ook moge zijn) IN een database waar je je stored proc uitvoert.

Ik denk dat de topicstarter even een stap terug moet doen en goed moet nadenken waarom hij een resultset wil met daarin zoveel tabellen verweven. 3e normaalvorm levert wel veel tabellen op, maar doorgaans heb je niet meer dan 2 a 3 joins nodig voor je resultset. Het opbouwen van een gui vanuit 1 gigaresultset is ogenschijnlijk 'sneller', maar je kunt dan beter je lijstjes initialiseren met aparte queries en niet opnieuw vullen vanuit een erg brede resultset. (wat hierboven denk ik als client side caching wordt aangemerkt). Alleen de dynamische data ophalen, wat imho je query al een stuk kleiner zal maken.

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ik weet niet of het al gezegd is...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
strSQL=    "SELECT *"
strSQL=strSQL & "FROM"
strSQL=strSQL & "     TblTotaaloverzichtprojectsheets,"
strSQL=strSQL & "     TblKeuze," 
strSQL=strSQL & "     TblBusinessType,"
strSQL=strSQL & "     TblProjectGoal,"
strSQL=strSQL & "     TblStrategyType,"
strSQL=strSQL & "     TblProcessFocus,"
strSQL=strSQL & "     TblEvolutionType"

strSQL=strSQL & " WHERE"
strSQL=strSQL & "   TblTotaaloverzichtprojectsheets.ProID = 1"
strSQL=strSQL & " AND  TblKeuze.ProID = 1" 
strSQL=strSQL & " AND  TblKeuze.[Business TypeID] = TblBusinessType.[Business TypeID]"
strSQL=strSQL & " AND  TblKeuze.[Process FocusID] = TblProcessFocus.[Process FocusID]"
strSQL=strSQL & " AND  TblKeuze.[Project GoalID] = TblProjectGoal.[Project GoalID]"
strSQL=strSQL & " AND  TblKeuze.[Strategy TypeID] = TblStrategyType.[Strategy TypeID]"
strSQL=strSQL & " AND  (TblKeuze.[Evolution TypeID] = TblEvolutionType.[Evolution TypeID] OR IsNull(TblEvolutionType.[Evolution TypeID]))"

Ziet er vrij logisch uit toch?

Verwijderd

T.a.t. OR clauses vermijden. Bij grotere tables zakt je performance gigantisch in.

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Op woensdag 19 december 2001 12:31 schreef Otis het volgende:
T.a.t. OR clauses vermijden. Bij grotere tables zakt je performance gigantisch in.
Zeg kerel, als er geen andere manier is...

Verwijderd

Die is er altijd met SQL, dat is het leuke :)

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Op woensdag 19 december 2001 12:57 schreef Otis het volgende:
Die is er altijd met SQL, dat is het leuke :)
Nou ja, heeft hij in iedergeval iets, tot de tijd dat iemand eindelijk heeft uitgevonden hoe het zonder OR moet :)

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
bedankt voor je hulp graveheart :) maar werken doet het niet, want als TblEvolutionType.[Evolution TypeID] leeg is dan krijg ik nog steeds een lege recordset terug :(

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Al opgevallen dat TblTotaaloverzichtprojectsheets los staat van alles?

Als je die relatie ff laat zien, zal ik kijken of ik het voor elkaar krijg.

Of is dit verder goed:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT * FROM
   TblTotaaloverzichtprojectsheets INNER JOIN
    (TblWebsiteType INNER JOIN
       (TblBusinessType INNER JOIN
        (TblEvolutionType INNER JOIN
           (TblExterneRealisatie INNER JOIN
            (TblInitiator INNER JOIN
               (TblPartnerBijRealisatie INNER JOIN
                (TblProcessFocus INNER JOIN
                   (TblProjectGoal INNER JOIN
                    (TblSoftwareUsed INNER JOIN
                       (TblStrategyType INNER JOIN
                        (TblTemplate INNER JOIN TblKeuze ON TblTemplate.TemplateID = TblKeuze.TemplateID)
                        ON TblStrategyType.[Strategy TypeID] = TblKeuze.[Strategy TypeID])
                       ON TblSoftwareUsed.[Software UsedID] = TblKeuze.[Software UsedID])
                    ON TblProjectGoal.[Project GoalID] = TblKeuze.[Project GoalID])
                   ON TblProcessFocus.[Process FocusID] = TblKeuze.[Process FocusID])
                ON TblPartnerBijRealisatie.[Partner bij realisatieID] = TblKeuze.[Partner bij realisatieID])
               ON TblInitiator.InitiatorID = TblKeuze.InitiatorID)
            ON TblExterneRealisatie.[Externe realisatieID] = TblKeuze.[Externe realisatieID])
           ON TblEvolutionType.[Evolution TypeID] = TblKeuze.[Evolution TypeID])
        ON TblBusinessType.[Business TypeID] = TblKeuze.[Business TypeID])
       ON TblWebsiteType.[Website TypeID] = TblKeuze.[Website TypeID])
    ON TblTotaaloverzichtprojectsheets.ProID = TblKeuze.ProID
WHERE TblTotaaloverzichtprojectsheets.ProID = 1

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Nog een gooi:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * 
FROM ((((((((((TblKeuze 
INNER JOIN TblTotaaloverzichtprojectsheet ON TblTotaaloverzichtprojectsheets.ProID = TblKeuze.ProID)
INNER JOIN TblWebsiteType ON TblWebsiteType.[Website TypeID] = TblKeuze.[Website TypeID])
INNER JOIN TblBusinessType ON TblBusinessType.[Business TypeID] = TblKeuze.[Business TypeID])
INNER JOIN TblExterneRealisatie ON TblExterneRealisatie.[Externe realisatieID] = TblKeuze.[Externe realisatieID])
INNER JOIN TblInitiator ON TblInitiator.InitiatorID = TblKeuze.InitiatorID)
INNER JOIN TblPartnerBijRealisatie ON TblPartnerBijRealisatie.[Partner bij realisatieID] = TblKeuze.[Partner bij realisatieID])
INNER JOIN TblProcessFocus ON TblProcessFocus.[Process FocusID] = TblKeuze.[Process FocusID])
INNER JOIN TblProjectGoal ON TblProjectGoal.[Project GoalID] = TblKeuze.[Project GoalID])
INNER JOIN TblSoftwareUsed ON TblSoftwareUsed.[Software UsedID] = TblKeuze.[Software UsedID])
INNER JOIN TblStrategyType ON TblStrategyType.[Strategy TypeID] = TblKeuze.[Strategy TypeID])
LEFT JOIN TblEvolutionType ON TblEvolutionType.[Evolution TypeID] = TblKeuze.[Evolution TypeID]
WHERE TblTotaaloverzichtprojectsheets.ProID = 1

Het kan zijn dat ik een haakje verkeerd heb staan...

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 17:28
Graveheart, nogmaals bedankt voor de moeite!! :)

de eerste optie heeft hetzelfde resultaat als die van vanmorgen, en de 2e geeft een syntax error in join operation (niet de haakjes).

relatieschema:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TblTotaaloverzichtprojectsheets
   - ID
   * ProID
   - Project specifieke (unieke) gegevens

TblKeuze
  - ID
  * ProID
  * [Business TypeID]
  * etc.

TblBusinessType
  - ID
  * [Business TypeID]
  - [Business Type]

etc.

hoop dat het duidelijk is, alle terugkerende project gegevens zijn uitgenormaliseerd in de keuze tabel en die weer vervolgens naar losstaande tabellen.
Pagina: 1