Hoofdcategorieën
Topicacties

[MS SQL] - Query probleem

Pagina: 1 2 last

Reageer Nieuw Topic
Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

quote:
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?
De loop levert inderdaad het juiste resultaat 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.

Berichten: 336
Reg. datum: 22 maart 2005

quote:
Nutcaze schreef op dinsdag 08 juli 2008 @ 16:03:
[...]

De loop levert inderdaad het juiste resultaat op.
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.)
 
Dat was ik niet..
Berichten: 793
Reg. datum: 20 juli 2006

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.

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.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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.)
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.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

quote:
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.
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.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Berichten: 67
Reg. datum: 24 juni 2008

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)

 
Dat was ik niet..
Berichten: 793
Reg. datum: 20 juli 2006

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.
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.

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.

Berichten: 159
Reg. datum: 30 september 2005

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.

To be and not to be....that's relativity

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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)

Nee in die tabel kunnen geen NULL waardes voorkomen.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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.
Deze maakte niet uit (tenminste niet voor mijn resultaat dan).

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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.
De tabel ziet er exact zo uit als je zegt. Weekday geeft inderdaad de dag van de week aan.

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.

Berichten: 348
Reg. datum: 15 januari 2008

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
 
Dat was ik niet..
Berichten: 793
Reg. datum: 20 juli 2006

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.

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.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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
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...

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.

Wat gebeurt er als je de query opnieuw probeert op te bouwen?

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' )

 
Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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.
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.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Berichten: 67
Reg. datum: 24 juni 2008

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?

Cousin Boneless wijzigde dit bericht 09-07-2008 12:53 (14%)

 
Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

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
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?
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.

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.

Berichten: 67
Reg. datum: 24 juni 2008

Wat is het type van Stores.storeID en OpenTimes.storeID? Het lijkt erop dat het niet met elkaar matcht.
 
Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

Zijn beide GUID's helaas. Maar matchen absoluut wel.

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Berichten: 67
Reg. datum: 24 juni 2008

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.
 
Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

quote:
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.
Dit levert toch sowieso niets op? StoreID kan nooit Null zijn?!

Not all chemicals are bad. Without hydrogen or oxygen, for example, there would be no way to make water, a vital ingredient in beer.

Pitt drinker bij uitstek
Berichten: 473
Reg. datum: 02 oktober 1999

quote:
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.
Inderdaad, dit is toch uiteindelijk de oplossing!

De query nu:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT ST.StoreIDST.HtmlText1DZ.DeliveryCostDZ.MaximumOrderPriceST.StoreNameBR.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!

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.

Berichten: 67
Reg. datum: 24 juni 2008

Of je verwijst even naar de pagina waar dit truukje beschreven staat:
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%)

 

Pagina: 1 2 last



VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: