Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
1
| SELECT ... FROM tabel WHERE id NOT IN ( SELECT id FROM andere tabel WHERE cijfer = 6 ) |
Gewoon, eens logisch nadenken, en eens opschrijven wat je nu eigenlijk precies wel (of niet) wil hebben ...
[ Voor 32% gewijzigd door whoami op 08-07-2008 14:19 ]
https://fgheysels.github.io/
If it isn't broken, fix it until it is..
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
https://fgheysels.github.io/
De volgende query levert 0 resultaten:
1
2
3
4
5
6
7
8
9
| SELECT DISTINCT ST.StoreID, ST.StoreName FROM DeliveryZips DZ ,Stores ST,addresses AD, branches BR, branch2Stores BS WHERE DZ.StoreID = ST.StoreID AND AD.OwnerID = ST.StoreID AND BS.StoreID = ST.StoreID AND BR.BranchID = BS.BranchID AND '" & Postcode & "' BETWEEN DZ.ZipFrom AND DZ.ZipUntil AND NOT ST.storeID IN (SELECT storeID FROM OpenTimes WHERE weekday = 6) ORDER BY storename |
Als ik dit echter omschrijf tot:
1
2
3
4
5
6
7
8
| SELECT DISTINCT ST.StoreID, ST.StoreName FROM DeliveryZips DZ ,Stores ST,addresses AD, branches BR, branch2Stores BS WHERE DZ.StoreID = ST.StoreID AND AD.OwnerID = ST.StoreID AND BS.StoreID = ST.StoreID AND BR.BranchID = BS.BranchID AND '" & Postcode & "' BETWEEN DZ.ZipFrom AND DZ.ZipUntil ORDER BY storename |
Vervolgens door deze records heenloop en het volgende in die loop plaats:
1
2
3
| rsOpeningstijden.Open "SELECT opentimeID FROM OpenTimes WHERE storeID = '" & WinkelID & "' AND weekday = 6", con, adOpenForwardOnly, adLockReadOnly If rsOpeningstijden.eof Then Meenemen = True Else Meenemen = False rsOpeningstijden.Close |
Dan staat de variabele Meenemen 5 keer op True
Ik zie niet precies wat het verschil is maar het is er kennelijk wel degelijk. Het maakt niets uit wat ik als weekday invul in de bovenste query, er komen altijd 0 resultaten uit en ik zie maar niet wat het verschil is.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
1
| AND NOT ST.storeID IN (SELECT storeID FROM OpenTimes WHERE weekday = 6) |
Levert dat hetzelfde resultaat op als st.storeID NOT IN ( ... ) ?
https://fgheysels.github.io/
Bij deze.whoami schreef op dinsdag 08 juli 2008 @ 15:30:
Gebruik eens code-tags voor het posten van code ...
code:
1 AND NOT ST.storeID IN (SELECT storeID FROM OpenTimes WHERE weekday = 6)
Levert dat hetzelfde resultaat op als st.storeID NOT IN ( ... ) ?
Ehm even geprobeerd want wist niet zeker of dit inderdaad hetzelfde was (had het ook niet gezien eerlijk gezegd), maar ook dan levert ie geen resultaten op.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Kan je niet eens 1 van die 5 gevallen volledig uitpluizen, om te controleren wat het juiste antwoord zou moeten zijn? Of is al bekend dat het loopje het juiste resultaat oplevert?Nutcaze schreef op dinsdag 08 juli 2008 @ 15:34:
[...]
Bij deze.
Ehm even geprobeerd want wist niet zeker of dit inderdaad hetzelfde was (had het ook niet gezien eerlijk gezegd), maar ook dan levert ie geen resultaten op.
[ Voor 6% gewijzigd door KopjeThee op 08-07-2008 16:01 ]
De loop levert inderdaad het juiste resultaat op.KopjeThee schreef op dinsdag 08 juli 2008 @ 16:00:
[...]
Kan je niet eens 1 van die 5 gevallen volledig uitpluizen, om te controleren wat het juiste antwoord zou moeten zijn? Of is al bekend dat het loopje het juiste resultaat oplevert?
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Ze lijken toch wel erg op elkaar. Heb je al wat geprobeerd te debuggen? Bijvoorbeeld kijken wat er uit de "niet loop" variant komt als je de "where weekday = 6" weg laat. Het lijkt mij dat dat hetzelfde zou moeten zijn als de eerste tabel van de "wel loop" variant (dus voor de loop filtering). (Tenzij niet alle storeid's voorkomen in die openingstijden tabel.)Nutcaze schreef op dinsdag 08 juli 2008 @ 16:03:
[...]
De loop levert inderdaad het juiste resultaat op.
1
| where StoreID IN (select StoreID from OpenTimes where Weekday <> 6 ) |
worden dan?
Het is namelijk een beetje raar dat je eerst alle winkels opvraagt welke op dag X open zijn en dan deze vervolgens negeert (NOT IN). Bovenstaand levert alle winkels op welke op zijn met uitzondering op dag X.
If it isn't broken, fix it until it is..
Als ik de weekday weghaal krijg ik sowieso geen resultaat aangezien ze allemaal wel een dag open zijn. Als ik een innerjoin maak ook op de opentimes tabel krijg ik keurig te zien op welke dagen ze wel of niet open zijn dus ik zou verwachten dat bovenstaande moet werken maar toch ... geen resultaten.KopjeThee schreef op dinsdag 08 juli 2008 @ 16:20:
[...]
Ze lijken toch wel erg op elkaar. Heb je al wat geprobeerd te debuggen? Bijvoorbeeld kijken wat er uit de "niet loop" variant komt als je de "where weekday = 6" weg laat. Het lijkt mij dat dat hetzelfde zou moeten zijn als de eerste tabel van de "wel loop" variant (dus voor de loop filtering). (Tenzij niet alle storeid's voorkomen in die openingstijden tabel.)
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Ik haal eerst alle winkels op uit het bezorggebied en niet diegene die op die dag open zijn. Als ik weekday <> 6 zou gebruiken zou er sowieso geen 1 uitkomen aangezien ze altijd wel een dag open zijn.Niemand_Anders schreef op dinsdag 08 juli 2008 @ 16:46:
Moet het niet
SQL:
1 where StoreID IN (select StoreID from OpenTimes where Weekday <> 6 )
worden dan?
Het is namelijk een beetje raar dat je eerst alle winkels opvraagt welke op dag X open zijn en dan deze vervolgens negeert (NOT IN). Bovenstaand levert alle winkels op welke op zijn met uitzondering op dag X.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
1
| (SELECT storeID FROM OpenTimes WHERE weekday = 6) |
Dat levert namelijk nooit iets op. In dat geval moet je er dus van maken:
1
| (SELECT storeID FROM OpenTimes WHERE weekday = 6 and storeID IS NOT NULL) |
Weekday geeft niet dat openingsdag (OpenTimes!) aan zoals zaterdag, zondag, etc? Weet je wat ik verwacht van een tabel OpenTimes:Nutcaze schreef op dinsdag 08 juli 2008 @ 16:53:
[...]
Ik haal eerst alle winkels op uit het bezorggebied en niet diegene die op die dag open zijn. Als ik weekday <> 6 zou gebruiken zou er sowieso geen 1 uitkomen aangezien ze altijd wel een dag open zijn.
OpenTimes
-----------------
OpenTimesID
StoreID
Weekday
OpeningTime
ClosingTime
Op koopavond zal een winkel langer open zijn dan op een andere weekdag. Ook zijn veel winkels op maandag later open dan de rest van de week. Maar wat geeft Weekday=6 dan aan? Want ik maakte de aanname dat hiermee vrijdag werd aangegeven (zondag=1, maandag=2, dinsdag=3, etc).
De subquery (de eerst query uit je tweede reactie) geeft alle winkels terug welke een record met weekday=6 hebben. Dus ook de winkels buiten het zorggebied. Vervolgens draai je middels de 'NOT IN' het resultaat om.
If it isn't broken, fix it until it is..
1
| AND NOT ST.storeID IN ..... |
eens verandert in
1
| AND ST.storeID NOT IN ..... |
Mijn gok is dat NOT ST.storeID eerst ge-evalueerd wordt voordat deze vergeleken wordt met de subquery.
When life gives you lemons, start a battery factory
Nee in die tabel kunnen geen NULL waardes voorkomen.Cousin Boneless schreef op dinsdag 08 juli 2008 @ 18:34:
Kan het misschien zo zijn je subquery ook NULL waardes teruggeeft, ofwel dat er een record in die tabel OpenTimes staat met voor storeID een waarde NULL?
SQL:
1 (SELECT storeID FROM OpenTimes WHERE weekday = 6)
Dat levert namelijk nooit iets op. In dat geval moet je er dus van maken:
SQL:
1 (SELECT storeID FROM OpenTimes WHERE weekday = 6 and storeID IS NOT NULL)
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Deze maakte niet uit (tenminste niet voor mijn resultaat dan).KabouterSuper schreef op woensdag 09 juli 2008 @ 09:12:
Als je
code:
1 AND NOT ST.storeID IN .....
eens verandert in
code:
1 AND ST.storeID NOT IN .....
Mijn gok is dat NOT ST.storeID eerst ge-evalueerd wordt voordat deze vergeleken wordt met de subquery.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
De tabel ziet er exact zo uit als je zegt. Weekday geeft inderdaad de dag van de week aan.Niemand_Anders schreef op woensdag 09 juli 2008 @ 09:06:
[...]
Weekday geeft niet dat openingsdag (OpenTimes!) aan zoals zaterdag, zondag, etc? Weet je wat ik verwacht van een tabel OpenTimes:
OpenTimes
-----------------
OpenTimesID
StoreID
Weekday
OpeningTime
ClosingTime
Op koopavond zal een winkel langer open zijn dan op een andere weekdag. Ook zijn veel winkels op maandag later open dan de rest van de week. Maar wat geeft Weekday=6 dan aan? Want ik maakte de aanname dat hiermee vrijdag werd aangegeven (zondag=1, maandag=2, dinsdag=3, etc).
De subquery (de eerst query uit je tweede reactie) geeft alle winkels terug welke een record met weekday=6 hebben. Dus ook de winkels buiten het zorggebied. Vervolgens draai je middels de 'NOT IN' het resultaat om.
Over de laatste alinea: dat is volgens mij ook precies de bedoeling maar het levert in ieder geval niet het resultaat op wat ik verwacht.
[ Voor 8% gewijzigd door Nutcaze op 09-07-2008 09:53 ]
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Nog een alternatief: Kijk eens wat een alternatieve query oplevert (oa NOT EXISTS (SELECT ...), LEFT JOIN ... WHERE ... IS NULL en ... EXCEPT SELECT ... zijn mogelijk).
Nog 2 losse opmerkingen:
- waarom join je branches mee?
- "if a then b=true else b=false" is hetzelfde als b=a
Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten
Maar wat is eigenlijk het doel van de query? Volgens mij heb je de openingstijden nog helemaal niet nodig. Naar mijn mening kun je beter eerst een overzicht tonen van alle winkels (en misschien de afstand tot de ingevoerde postcode) in postcode gebied X. Pas als de winkel wordt geselecteerd lijkt mij dat de openingstijden interessant worden.
If it isn't broken, fix it until it is..
De controle op meenemen zet ik onder commentaar als ik de bovenste query gebruik, maar ook als ik de query rechtsstreeks loslaat in sql server levert ie geen resultaten op dus...pedorus schreef op woensdag 09 juli 2008 @ 10:08:
Tsja, een vrij vreemd probleem lijkt me dit. Wellicht staat meenemen op false en zie je zo de rijen niet? Alternatief: kijk eens of het resultaat van de losse subquery wel klopt. Op welke records gaat het mis en waarom?
Nog een alternatief: Kijk eens wat een alternatieve query oplevert (oa NOT EXISTS (SELECT ...), LEFT JOIN ... WHERE ... IS NULL en ... EXCEPT SELECT ... zijn mogelijk).
Nog 2 losse opmerkingen:
- waarom join je branches mee?
- "if a then b=true else b=false" is hetzelfde als b=a
Die alternatieven die je laat zien ben ik geen held in helaas.
Opmerkingen:
1: ik haal nog meer velden op dan in het voorbeeld zichtbaar (ook uit dat record dus
2: en dan doel je op
1
| If rsOpeningstijden.eof Then Meenemen = True Else Meenemen = False |
zeker? Tjaa is een keuze, ik kan dan meteen de recordset weer sluiten.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Eerst maar eens de winkels vinden die weekday 6 open zijn.
Verder er rekening mee houden dat die set voor een bepaald postcode gebied leeg kan zijn?
Dan kun je toch ineens met NULL zitten?
Wat doet het volgende officieel?
1
| SELECT * WHERE id NOT IN ( 'lege set' ) |
De winkels die open zijn op die dag en binnen de geselecteerde tijd heb ik, de winkels die die dag wel open zijn maar NIET binnen de geselecteerde tijd heb ik ook. Alleen de winkels die die hele dag NIET open zijn heb ik niet. Voor die winkels zijn dan in de OpenTimes tabel wel records aanwezig maar niet met de geselecteerde weekday (bijv. 6). Tijden doen er dan ook niet toe want er is helemaal geen record aanwezig waar de tijden in staan.Niemand_Anders schreef op woensdag 09 juli 2008 @ 10:28:
Vereenvoudig anders gewoon eerst je query en beperk je to DeliveryZips, Stores en OpenTimes. De rest (branches, addresses, etc) is totdat je 'basis' query correct is rommel. Ofwel haal eerst de winkels (StoreID's) op van alle winkels in postcode gebied X en welke open zijn op dag X.
Maar wat is eigenlijk het doel van de query? Volgens mij heb je de openingstijden nog helemaal niet nodig. Naar mijn mening kun je beter eerst een overzicht tonen van alle winkels (en misschien de afstand tot de ingevoerde postcode) in postcode gebied X. Pas als de winkel wordt geselecteerd lijkt mij dat de openingstijden interessant worden.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Is er verschil tussen:
1
2
3
| SELECT * FROM Stores ST WHERE ST.storeID NOT IN (SELECT storeID FROM OpenTimes WHERE weekday = 6) |
en:
1
2
3
| SELECT * FROM Stores ST WHERE ST.storeID NOT IN (SELECT storeID FROM OpenTimes WHERE [weekday] = 6) |
Of leveren beide 0 records op?
[ Voor 14% gewijzigd door Cousin Boneless op 09-07-2008 12:53 ]
Helaas, had even hoop hoewel het in andere queries met weekday wel goed ging. Beide 0 resultaten. SQL server Enterprise Manager haalt zelfs de rechte haken er weer af.Cousin Boneless schreef op woensdag 09 juli 2008 @ 12:12:
Zou het misschien kunnen komen doordat weekday een reserved woord is in sqlserver?
Is er verschil tussen:
SQL:
1 2 3 SELECT * FROM Stores ST WHERE ST.storeID NOT IN (SELECT storeID FROM OpenTimes WHERE weekday = 6)
en:
SQL:
1 2 3 SELECT * FROM Stores ST WHERE ST.storeID NOT IN (SELECT storeID FROM OpenTimes WHERE [weekday] = 6)
Of leveren beide 0 records op?
Overigens leveren bovenstaande queries wel resultaten op, als je alleen op de OpenTimes tabel een query draait met weekday 6.
[ Voor 8% gewijzigd door Nutcaze op 09-07-2008 14:23 ]
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
1
2
3
4
| select st.* from Stores st left join OpenTimes ot on ot.storeID = st.storeID and ot.weekday = 6 where ot.storeID is null |
En als daar ook niets uitkomt, dan is het tijd om naar sqlserver te kijken.. misschien zijn de indexen currupt.
Dit levert toch sowieso niets op? StoreID kan nooit Null zijn?!Cousin Boneless schreef op woensdag 09 juli 2008 @ 18:15:
Je kan het nog herschrijven naar..
SQL:
1 2 3 4 select st.* from Stores st left join OpenTimes ot on ot.storeID = st.storeID and ot.weekday = 6 where ot.storeID is null
En als daar ook niets uitkomt, dan is het tijd om naar sqlserver te kijken.. misschien zijn de indexen currupt.
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten
Inderdaad, dit is toch uiteindelijk de oplossing!Cousin Boneless schreef op woensdag 09 juli 2008 @ 18:15:
Je kan het nog herschrijven naar..
SQL:
1 2 3 4 select st.* from Stores st left join OpenTimes ot on ot.storeID = st.storeID and ot.weekday = 6 where ot.storeID is null
En als daar ook niets uitkomt, dan is het tijd om naar sqlserver te kijken.. misschien zijn de indexen currupt.
De query nu:
1
2
3
4
5
6
7
8
9
10
11
| SELECT ST.StoreID, ST.HtmlText1, DZ.DeliveryCost, DZ.MaximumOrderPrice, ST.StoreName, BR.Description FROM DeliveryZips DZ INNER JOIN Stores ST ON DZ.StoreID = ST.StoreID INNER JOIN Addresses AD ON ST.StoreID = AD.OwnerID INNER JOIN Branch2Stores BS ON ST.StoreID = BS.StoreID INNER JOIN Branches BR ON BS.BranchID = BR.BranchID LEFT OUTER JOIN OpenTimes ot ON ot.StoreID = ST.StoreID AND ot.Weekday = 4 WHERE ('1000AA' BETWEEN DZ.ZipFrom AND DZ.ZipUntil) AND (ot.StoreID IS NULL) ORDER BY ST.StoreName |
Allemaal onwijs bedankt voor het meedenken en de uiteindelijke oplossing!
[ Voor 3% gewijzigd door Nutcaze op 10-07-2008 10:34 ]
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
http://dev.mysql.com/doc/...rewriting-subqueries.html
Maar jammer dat het zo moet. Dat is om een bug heenwerken..
[ Voor 17% gewijzigd door Cousin Boneless op 10-07-2008 10:23 ]