Avatar billede snowball Novice
14. januar 2004 - 14:30 Der er 11 kommentarer og
2 løsninger

MS SQL vs. Oracle mht. SQL syntakst

Hej.

Jeg har en større applikation der som et forsøg skal prøve at køre på Oracle. Normalt bruges MS SQL Server 7 som database og SQL'en er derfor mere eller mindre tilpasses MS SQL Server. Jeg har derfor mine tvivl vedr. om det i det hele taget vil virke på Oracle.

Jeg er ikke så nervøs for sådan noget som LEFT/RIGHT, INNER/OUTER joins, men hvad med sub-select - kan Oracle klare det? Hvad med ting som SUM() og MAX() ? Vil nedenstående SQL sætninger umiddelbart virke på Oracle? Hvis nej, skal der en lille eller større ændring til?

SELECT Init,Status FROM APV_Week_Header
WHERE (Status=1 OR Status=2) AND IWeek = 1 AND IYear = 2000 AND Init IN
(SELECT Init FROM APV_User_Info WHERE ExpenseDep IN
(SELECT ExpenseDep FROM APV_User_Department)
AND ExpenseDep IN (SELECT ExpenseDep FROM APV_ExpenseDep_Admin WHERE Init = 'ABC'))
ORDER BY Init

SELECT WH.IWeek AS Week, WH.IYear AS Year,
MAX(DISTINCT WD.DESCRIPTION) AS Description,
WD.DKE AS DKE, MAX(DISTINCT WD.CODE) AS Code,
SUM(WD.HOURS) AS Hours, WE.Task_Name
FROM APV_Week_Header AS WH INNER JOIN
APV_Week_Data AS WD ON WH.ID = WD.ID
LEFT JOIN APV_Week_Etc WE ON WH.ID = WE.WeekID
WHERE (WH.INIT = 'ABC') AND (WH.IYear BETWEEN 2000 AND 2001)
AND (WD.DKE LIKE '%DKE-100%') AND (WD.DESCRIPTION LIKE '%noget%')
GROUP BY WH.IWeek, WH.IYear, WD.DKE, WE.Task_Name
ORDER BY Year, Week, DKE

Er der evt. andre ting jeg skal være opmærksom på?

På forhånd tak.

Snowball
Avatar billede avlund Nybegynder
14. januar 2004 - 14:32 #1
Umiddelbart kan jeg ikke se noget, som ikke burde virke. Oracle er en af de databaser med absolut størst "ordforråd" indenfor SQL, men den har en del sjove "hjemmelavede" syntakser, man lige skal tage højde for.

Men de to queries ovenover burde, efter min bedste vidende, fungere.
Avatar billede snowball Novice
14. januar 2004 - 14:37 #2
Findes der til Oracle noget lignende MS SQL's Query Analyzer som kan tjekke sytaksten af ens SQL?
Avatar billede avlund Nybegynder
14. januar 2004 - 14:48 #3
Jeg ved det faktisk ikke. Jeg har kun arbejdet med Oracle et halvt år og har mest brugt deres SQL Plus-interface til at tilgå det med.
Avatar billede trer Nybegynder
14. januar 2004 - 15:46 #4
Du kan bruge TOAD fra Quest Software - det er noget af det bedste der findes til Oracle.

Mht joins - du skal være obs på, at kun Oracle 9i understøtter INNER / OUTER syntaksen. I tidligere versioner skal du skrive om til den gamle syntaks med (+) for outer join.

Performance mæssigt kan der være nogle ting der er anderledes - MSSQLs query optimizer benytter flere index i valg af plan - Oracle benytter kun 1 index. Og statistikker på index i Oracle opdateres ikke automatisk - det skal du selv håndtere.

Oracle er absolut ikke nemmere at drifte end MsSQL - tværtom!
Avatar billede snowball Novice
14. januar 2004 - 16:00 #5
trer: Jeg prøver lige at finde ud af hvilken version af Oracle det evt. skal køre på. Men hvis vi nu siger at det version 9i eller nyere (hvis der findes en nyere ;)), vil ovenstående SQL sætninger så virke uden at de skal skrives om? (det er mest det jeg er ude efter!)
Avatar billede trer Nybegynder
14. januar 2004 - 16:43 #6
Efter min bedste overbevisning - ja.

Men din SQL forudsætter at du er logget på Oracle instansen med skemaejeren for de pågældende tabeller eller har erklæret public synonyms for dem. 

Er det ikke tilfældet skal du prefixe tabelnavnene med skemaejeren.
Avatar billede lap Nybegynder
14. januar 2004 - 18:36 #7
jeg vil blot bekræfte trer/avlund - det er ikke noget i ovenstående, som ikke burde virke.

Du skal dog være meget opmærksom på performance. Oracle's optimizer virker helt sikkert MEGET anderledes en MS'. Hvis du begynder at få performance problemer, så skal din kode skrives om - og du skal selv sørge for vedligeholdelse af statistikker.

Og Oracle 9i release 2 (9.2.0.4) er den nyeste - med mindre der er kommet en ny patch indenfor de sidste 2 måneder.
Avatar billede lap Nybegynder
14. januar 2004 - 18:42 #8
Performance mæssigt er følgende en meget dårlig kode - i hvert fald i oracle - i stedet for at bruge en IN - så bør der bruges et almindeligt join. Jeg kan se, at det godt kan laves som et rent join imellem 4 tabeller:

SELECT Init,Status FROM APV_Week_Header
WHERE (Status=1 OR Status=2)
AND IWeek = 1
AND IYear = 2000
AND Init IN
(SELECT Init FROM APV_User_Info WHERE ExpenseDep IN
SELECT ExpenseDep FROM APV_User_Department) AND ExpenseDep IN
(SELECT ExpenseDep FROM APV_ExpenseDep_Admin WHERE Init = 'ABC'))

og hvis jeg gætter rigtigt, så er mange af IN unødvendige - Init = 'ABC' i inderste select gør formentlig, at yderste Init også er ABC - men jeg gætter!
Avatar billede snowball Novice
14. januar 2004 - 19:08 #9
Har efterhånden fundet ud af at det burde virke - hvilket jeg også lige har fået bekræftet fra en der arbejder med Oracle til daglig :)

lap: Ligger du lige et svar?
Avatar billede lap Nybegynder
14. januar 2004 - 19:25 #10
ingen svar fra en, som har arbejdet med oracle i 14 år (fra oracle 5 :-)
Avatar billede snowball Novice
14. januar 2004 - 19:28 #11
Ok ;)

Tak for hjælpen til jer alle.
Avatar billede avlund Nybegynder
14. januar 2004 - 19:35 #12
Tak for points.
Avatar billede trer Nybegynder
14. januar 2004 - 19:40 #13
også tak herfra :-)
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