webForumDet fria alternativet

Syntax error in FROM clause

12 svar · 873 visningar · startad av Pedda

PeddaMedlem sedan juni 20006 032 inlägg
#1

Har kört fast med min select.
Någon som ser vad jag gör för fel?

"SELECT f.functionId, f.functionName, f.functionIdentifier, h.hardwareId, h.hardwareName " +
"FROM hardware h " +
"INNER JOIN (functions f INNER JOIN references r " +
"ON f.functionId = r.ref_function) " +
"ON h.hardwareId = r.ref_hardware " +
"WHERE r.ref_manual=" + manualId +
" ORDER BY f.functionName ASC";

Bifogar även en bild så det är lättare att förstå relationerna.

relationships.png
nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Spontant ser det rätt ut. Om du inte har provat det, prova att bygga upp frågan från början bit för bit och se var felet uppstår.

The_HulkMedlem sedan juni 20031 837 inlägg
#3

Känns som att du har fel ordning på dina inner join. Kanske bara är jag inte som kan det till 100%. Du har ju en relation mellan h och r, mellan f och r. Borde inte du joina in r före f?

"SELECT f.functionId, f.functionName, f.functionIdentifier, h.hardwareId, h.hardwareName " +
"FROM hardware h " +
"INNER JOIN references r ON h.hardwareId = r.ref_hardware " +
"INNER JOIN functions f ON f.functionId = r.ref_function " +
"WHERE r.ref_manual=" + manualId +
" ORDER BY f.functionName ASC";

Jag kan vara ute och cykla men det skulle vara min gissning.

PeddaMedlem sedan juni 20006 032 inlägg
#4

Har testat det redan och det ger samma felmeddelande.

The_HulkMedlem sedan juni 20031 837 inlägg
#5

Om du hoppar över en av "inner join" t.ex. för att börja testa, hur fungerar det då?

Hmm, är det inte bättre att ha references som huvudtabell och joina in hardware och functions med tanke på att references ligger med i where-satsen?

SPiNMedlem sedan mars 20007 896 inlägg
#6

Jag tycker om att ha referenstabellen "ytterst";

select
   f.functionId,
   f.functionName,
   f.functionIdentifier,
   h.hardwareId,
   h.hardwareName
from
   `references` as r
   inner join
      `functions` as f
      on f.functionId=r.ref_function
   inner join
      `hardware` as h
      on h.hardwareId=r.ref_hardware
where
   r.ref_manual=:manualId
order by
   f.functionName asc

Problemet med syntax error kan dock ha att göra med att "references" och "functions" kan vara reserverade ord i din DBMS. Ovanstående kod utgår från MySQL, använder du Access eller SQL Server byter du ut `tabellnamn` mot [tabellnamn].

jmeMedlem sedan maj 20012 237 inlägg
#7

Jag skulle nog också gissa att problemet ligger i att du använder ett reserverat ord (references). Pröva atta omsluta det ordet med backticks (i MySql): `references`.

TroxyMedlem sedan mars 20041 505 inlägg
#8

I det första inlägget så "joinar" du en "derived tabled" som du kallar "h".
Men du verkar ha glömt att skriva "AS h" så det får inte rätt alias.

PeddaMedlem sedan juni 20006 032 inlägg
#9

SPiN skrev:

Jag tycker om att ha referenstabellen "ytterst";

...

Problemet med syntax error kan dock ha att göra med att "references" och "functions" kan vara reserverade ord i din DBMS. Ovanstående kod utgår från MySQL, använder du Access eller SQL Server byter du ut `tabellnamn` mot [tabellnamn].

Ditt förslag ger felmeddelandet:
Syntax error (missing operator) in query expression 'f.functionId=r.ref_function inner join hardware as h on h.hardwareId=r.ref_hardware'.

Det är en Access databas, och jag har testat med hakparenteser och även testat att döpa om tabellerna, men resultatet är detsamma ändå.

jmeMedlem sedan maj 20012 237 inlägg
#10

Vad jag vet så behöver man inte skriva AS.

Foo AS f är samma sak som Foo f.

PeddaMedlem sedan juni 20006 032 inlägg
#11

Verkar som att references var ett reserverat ord iaf. Vet inte varför det inte slog igenom på en gång när jag bytte namn på tabellen, men nu fungerar det med min ursprungliga query.

SPiNMedlem sedan mars 20007 896 inlägg
#12

Pedda skrev:

Ditt förslag ger felmeddelandet:
Syntax error (missing operator) in query expression 'f.functionId=r.ref_function inner join hardware as h on h.hardwareId=r.ref_hardware'.

Det är en Access databas, och jag har testat med hakparenteser och även testat att döpa om tabellerna, men resultatet är detsamma ändå.

Eh, missade bara en 'as r' i frågan. Koncentrerade mig mer på att innesluta tabellnamnen då jag gissade på att references var ett reserverat ord. ;)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#13

jme skrev:

Vad jag vet så behöver man inte skriva AS.

Foo AS f är samma sak som Foo f.

Jag med min ganska begränsade erfarenhet av olika SQL-dialekter har fått för mig att man bör använda AS vid värde-namn, men undvika det vid tabellnamn, alltså:

SELECT b.foo AS myfoo FROM bar b;

För MySQL kvittar det i båda fallen, men jag har något minne av att Oracle ogillar antingen att man använder AS vid tabellalias, eller att man inte gör det vid värdealias. Andra DBMS'er vet jag inget om. Någon som vet säkert får gärna bekräfta eller sparka mig i smalbenet om jag har fel. :)

135 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)