Avatar billede decrypto Nybegynder
11. december 2003 - 15:11 Der er 24 kommentarer og
1 løsning

Jeg er begyndt at blive træt af SQL Server genereret queries

Følgende er pissenemt at lave på en SQL Server,
men pisse irriterende for at køre i MySQL, pga microsoft ikke følger SQL standarderne.

Selvom 'row' er et reserveret ord, bruger jeg en ældre version af MySQL, hvor der ikke er nogen problemer. Så det er rent syntaxen, der er noget galt med.


SELECT    theater.IDNR AS THEATER_ID, theater.NAME AS THEATER_NAME, row.NAME AS ROW_NAME, seat.SEATNUMBER, seat.IDNR AS SEAT_ID,
                      status.NAME AS STATUS
FROM        status INNER JOIN
                      seat_reservation ON status.IDNR = seat_reservation.STATUS_ID RIGHT OUTER JOIN
                      theater INNER JOIN
                      row INNER JOIN
                      seat ON row.IDNR = seat.ROW_ID ON theater.IDNR = row.THEATER_ID INNER JOIN
                      eventshow ON theater.IDNR = eventshow.THEATER_ID ON seat_reservation.SHOW_ID = eventshow.IDNR AND
                      seat_reservation.SEAT_ID = seat.IDNR
WHERE    (eventshow.IDNR = 1) AND (row.THEATER_ID = 1)
ORDER BY row.NAME, seat.SEATNUMBER DESC
Avatar billede arne_v Ekspert
11. december 2003 - 15:26 #1
MySQL har altså nogle store mangler i frohold til SQL standarden (før
version 4.1).

Problemet er formentligt igen at du skal have parenteser så de komme rfra venstre mod højre.
Avatar billede decrypto Nybegynder
11. december 2003 - 15:33 #2
Jo, men jeg fandt en SQL validator ude på nettet, som først brokkede sig over 'row' og bagefter 'NAME'. Den sagde at de var reserverede.

Efter at havet ændret disse navne. Sagde validatoren at de var transactional.
Avatar billede decrypto Nybegynder
11. december 2003 - 15:34 #3
OK, men jeg validerede udfra SQL-92. Der var der ingen problemer. Der fandtes en SQL-99 og SQL-2003.
Avatar billede arne_v Ekspert
11. december 2003 - 15:38 #4
Og det kan måske være svært at få dem vendt rigtigt. Så måske
på den gamle måde igen.

Men det er svært med OUTER JOIN.

Du kan prøve med:

SELECT theater.IDNR AS THEATER_ID, theater.NAME AS THEATER_NAME, row.NAME AS ROW_NAME, seat.SEATNUMBER, seat.IDNR AS SEAT_ID, status.NAME AS STATUS

FROM theater, row, seat, eventshow, status, seat_reservation

WHERE row.IDNR = seat.ROW_ID AND
      theater.IDNR = row.THEATER_ID AND
      theater.IDNR = eventshow.THEATER_ID AND
      (seat_reservation.SHOW_ID IS NULL OR seat_reservation.SHOW_ID = eventshow.IDNR) AND
      (seat_reservation.SEAT_ID IS NULL OR seat_reservation.SEAT_ID = seat.IDNR) AND
      (status.IDNR = seat_reservation.STATUS_ID) AND
      eventshow.IDNR = 1 AND
      row.THEATER_ID = 1

ORDER BY row.NAME, seat.SEATNUMBER DESC
Avatar billede decrypto Nybegynder
11. december 2003 - 15:43 #5
Ok jeg prøver lige
Avatar billede decrypto Nybegynder
11. december 2003 - 15:45 #6
Den virker halvt, jeg vil nemlig også have mine NULL værdier med, hvor der ikke er en status.NAME.
Avatar billede arne_v Ekspert
11. december 2003 - 15:48 #7
Virker den her sø-slange ?

SELECT theater.IDNR AS THEATER_ID, theater.NAME AS THEATER_NAME, row.NAME AS ROW_NAME, seat.SEATNUMBER, seat.IDNR AS SEAT_ID, status.NAME AS STATUS

FROM theater, row, seat, eventshow, status, seat_reservation

WHERE row.IDNR = seat.ROW_ID AND
      theater.IDNR = row.THEATER_ID AND
      theater.IDNR = eventshow.THEATER_ID AND
      (seat_reservation.SHOW_ID IS NULL OR seat_reservation.SHOW_ID = eventshow.IDNR) AND
      (seat_reservation.SEAT_ID IS NULL OR seat_reservation.SEAT_ID = seat.IDNR) AND
      (status.IDNR IS NULL OR seat_reservation.STATUS_ID IS NULL OR status.IDNR = seat_reservation.STATUS_ID) AND
      eventshow.IDNR = 1 AND
      row.THEATER_ID = 1

ORDER BY row.NAME, seat.SEATNUMBER DESC
Avatar billede decrypto Nybegynder
11. december 2003 - 15:53 #8
Nope.
Den viser mig også kun seats der har en status, og ikke samtlige seats om end de har en status eller NULL
Avatar billede arne_v Ekspert
11. december 2003 - 15:58 #9
Suk.
Avatar billede decrypto Nybegynder
11. december 2003 - 15:59 #10
Vil det hjælpe hvis du så basen for dig?
Avatar billede decrypto Nybegynder
11. december 2003 - 16:00 #11
Jeg går videre med det her kl.17.30. Håber du  også vil være around.
Avatar billede arne_v Ekspert
11. december 2003 - 16:02 #12
Nej - jeg forstå godt hvad du vil.

Ja.
Avatar billede decrypto Nybegynder
11. december 2003 - 16:07 #13
Jeg fik lavet løsningen.

Nu mangler jeg bare at teste den derhjemme:

SELECT    theater.IDNR AS THEATER_ID, theater.NAME AS THEATER_NAME, row.NAME AS ROW_NAME, seat.SEATNUMBER, seat.IDNR AS SEAT_ID,
                      status.NAME AS STATUS
FROM        status INNER JOIN
                      seat_reservation ON status.IDNR = seat_reservation.STATUS_ID RIGHT OUTER JOIN
                      seat INNER JOIN
                      theater INNER JOIN
                      eventshow ON theater.IDNR = eventshow.THEATER_ID INNER JOIN
                      row ON theater.IDNR = row.THEATER_ID ON seat.ROW_ID = row.IDNR ON seat_reservation.SHOW_ID = eventshow.IDNR AND
                      seat_reservation.SEAT_ID = seat.IDNR
WHERE    (seat_reservation.SHOW_ID IS NULL OR
                      seat_reservation.SHOW_ID = eventshow.IDNR) AND (seat_reservation.SEAT_ID IS NULL OR
                      seat_reservation.SEAT_ID = seat.IDNR) AND (eventshow.IDNR = 1) AND (row.THEATER_ID = 1)
ORDER BY row.NAME, seat.SEATNUMBER DESC
Avatar billede decrypto Nybegynder
11. december 2003 - 16:07 #14
hmmm der er er også nogle beskidte joins her kan jeg se. Håber på det bedste derhjemme.
Avatar billede trer Nybegynder
11. december 2003 - 16:22 #15
Det korrekte er faktisk at angive objektnavne i [ ] eller i " " når man bruger reserverede ord...
Avatar billede decrypto Nybegynder
11. december 2003 - 16:22 #16
Ja, det er jeg klar over.
Avatar billede trer Nybegynder
11. december 2003 - 16:25 #17
ok, men det funk'er så ikke i MySql?

Mht den gamle join måde - understøtter MySql ikke (+) syntaksen for outer joins?
Avatar billede decrypto Nybegynder
11. december 2003 - 16:27 #18
Ok, men jeg bruger, da ikke (+).
Avatar billede arne_v Ekspert
11. december 2003 - 16:29 #19
[] er mig bekendt en Access specialitet.

MySQL bruger ``.
Avatar billede trer Nybegynder
11. december 2003 - 16:30 #20
Det var blot fordi der ikke var angivet nogen (+) i arne_v's eksempel med gammel syntaks
Avatar billede arne_v Ekspert
11. december 2003 - 16:32 #21
Hvad mener du med + syntax ?

Gamle Sybase og MS SQLServer supporterer *= mener jeg. Er det den du tænker på ?
Avatar billede arne_v Ekspert
11. december 2003 - 16:32 #22
Nej - jeg forsøgte at simulere OUTER JOIN med OR IS NULL.
Avatar billede trer Nybegynder
11. december 2003 - 17:01 #23
Havde ikke bemærket detaljen med "OR IS NULL" - det undrede mig bare at der "manglede" den outer join som den første query havde.

[] bruges både i SQL Server og Access (samt Sybase?) - mens " " er en ANSI ting som også supporteres i SQL Server.
Avatar billede decrypto Nybegynder
11. december 2003 - 19:36 #24
Jeg sidder stadigvæk i saksen.....
Avatar billede decrypto Nybegynder
12. december 2003 - 13:36 #25
Jeg har hævet pointsatsen, på spørgsmålet, under et 'nyt' oprettet spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester