Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Reg. datum: 22 maart 2005
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.)quote:Nutcaze schreef op dinsdag 08 juli 2008 @ 16:03:
[...]
De loop levert inderdaad het juiste resultaat op.
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.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
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.quote: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.quote:Niemand_Anders schreef op dinsdag 08 juli 2008 @ 16:46:
Moet het niet
SQL:
1where 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.
Reg. datum: 24 juni 2008
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) |
Weekday geeft niet dat openingsdag (OpenTimes!) aan zoals zaterdag, zondag, etc? Weet je wat ik verwacht van een tabel OpenTimes:quote: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.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
Reg. datum: 30 september 2005
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.
To be and not to be....that's relativity
Nee in die tabel kunnen geen NULL waardes voorkomen.quote: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).quote: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.quote: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.
Nutcaze wijzigde dit bericht 09-07-2008 09:53 (8%)
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
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.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
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...quote: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
code:
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.
Reg. datum: 07 juni 2007
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?
SQL:
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.quote: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.
Reg. datum: 24 juni 2008
Is er verschil tussen:
SQL:
1 | SELECT *
|
en:
SQL:
1 | SELECT *
|
Of leveren beide 0 records op?
Cousin Boneless wijzigde dit bericht 09-07-2008 12:53 (14%)
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.quote: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
3SELECT *
FROM Stores ST
WHERE ST.storeID NOT IN (SELECT storeID FROM OpenTimes WHERE weekday = 6)
en:
SQL:
1
2
3SELECT *
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.
Nutcaze wijzigde dit bericht 09-07-2008 14:23 (8%)
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Reg. datum: 24 juni 2008
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Reg. datum: 24 juni 2008
SQL:
1 | select st.*
|
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?!quote:Cousin Boneless schreef op woensdag 09 juli 2008 @ 18:15:
Je kan het nog herschrijven naar..
SQL:
1
2
3
4select 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.
Inderdaad, dit is toch uiteindelijk de oplossing!quote:Cousin Boneless schreef op woensdag 09 juli 2008 @ 18:15:
Je kan het nog herschrijven naar..
SQL:
1
2
3
4select 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:
SQL:
1 | SELECT ST.StoreID, ST.HtmlText1, DZ.DeliveryCost, DZ.MaximumOrderPrice, ST.StoreName, BR.Description
|
Allemaal onwijs bedankt voor het meedenken en de uiteindelijke oplossing!
Nutcaze wijzigde dit bericht 10-07-2008 10:34 (3%)
Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.
Reg. datum: 24 juni 2008
http://dev.mysql.com/doc/...rewriting-subqueries.html
Maar jammer dat het zo moet. Dat is om een bug heenwerken..
Cousin Boneless wijzigde dit bericht 10-07-2008 10:23 (17%)