webForumDet fria alternativet

Missing operator

34 svar · 574 visningar · startad av Jesper T

Jesper TMedlem sedan nov. 20017 144 inlägg
#1

Microsoft JET Database Engine error '80040e14'

Syntax error (missing operator) in query expression ''.

calweek.asp, line 123

sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM (Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON k.namn_id = n.N_namn_id AND k.datum = n.N_datum"& _ 
          " Weight w k.namn_id = w.W_per_id AND k.datum = w.W_date"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"

Jag skulle vilja få med tabellen som heter "Weight" men det blir fel hur jag än vrider och vänder på detta.
Några idéer?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Lägg till en utskrift av frågan

sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM (Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON k.namn_id = n.N_namn_id AND k.datum = n.N_datum"& _ 
          " Weight w k.namn_id = w.W_per_id AND k.datum = w.W_date"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"
response.write sql
response.end
Jesper TMedlem sedan nov. 20017 144 inlägg
#3

Då står det:

SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight FROM (Calendar k LEFT JOIN Users p ON k.namn_id = p.P_id) LEFT JOIN notes n ON k.namn_id = n.N_namn_id AND k.datum = n.N_datum Weight w k.namn_id = w.W_per_id AND k.datum = w.W_date WHERE k.namn_id = 22 AND k.datum = #2002-11-18#

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Det kunde man ha sett på en gång om man tittat lite

sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM (Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON k.namn_id = n.N_namn_id AND k.datum = n.N_datum"& _ --- här saknas något
          " Weight w k.namn_id = w.W_per_id AND k.datum = w.W_date"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"

Skall det vara ytterligare en left join där weight ingår eller?

Jesper TMedlem sedan nov. 20017 144 inlägg
#5

Men petar jag in LEFT JOIN där så står det samma fel och sätter jag paranteser så står det: Syntax error in FROM clause

Weight-tabellens värden skall motsvara samma id och datum som clalendertabellen och notestabellen.

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Access är ju speciellt med hur man får skriva join. Det brukar behövas en hel del parenteser

Så här kanske

sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM ((Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON (k.namn_id = n.N_namn_id AND k.datum = n.N_datum)) LEFT JOIN "& _ 
          " Weight on (w k.namn_id = w.W_per_id AND k.datum = w.W_date)"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"
Jesper TMedlem sedan nov. 20017 144 inlägg
#7

Då står det:

Syntax error (missing operator) in query expression 'w k.namn_id = w.W_per_id AND k.datum = w.W_date'

Jesper TMedlem sedan nov. 20017 144 inlägg
#8

Ahhh, jag flyttade en parantes till vänster om "w"- funkar nu, Tack.

sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM ((Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON (k.namn_id = n.N_namn_id AND k.datum = n.N_datum)) LEFT JOIN "& _ 
          " Weight [b]w on ([/b]k.namn_id = w.W_per_id AND k.datum = w.W_date)"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"
LarsGMedlem sedan dec. 200012 464 inlägg
#9
sql="SELECT n.N_datum, n.N_Id, k.Frukt_id, n.N_namn_id, w.W_weight"& _ 
          " FROM ((Calendar k LEFT JOIN"& _ 
          " Users p ON k.namn_id = p.P_id) LEFT JOIN"& _ 
          " notes n ON (k.namn_id = n.N_namn_id AND k.datum = n.N_datum)) LEFT JOIN "& _ 
          " Weight w on (k.namn_id = w.W_per_id AND k.datum = w.W_date)"&_  
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"

ett w hamnade lite snett

Jesper TMedlem sedan nov. 20017 144 inlägg
#10

Nu till den väsentliga biten.
W_weight visar inget när jag loppar ut recsetet.
Men skriver jag endast:

 "select * from weight where W_per_id = " & Id & " AND W_date = #" & d & "#"

Så visas det?Konstigt!

Jesper TMedlem sedan nov. 20017 144 inlägg
#11

Ingen som vet?

Jesper TMedlem sedan nov. 20017 144 inlägg
#12

Nu ändrade jag till detta:

SQL = "SELECT n.Notes,n.N_datum,n.N_Id, k.Frukt_id, n.N_namn_id,w.W_weight" & vbCrLf & _ 
          " FROM (Calendar k LEFT JOIN" & vbCrLf & _ 
          " Weight w ON k.namn_id = w.W_per_id AND k.datum = w.W_date) LEFT JOIN" & vbCrLf & _ 
          " notes n ON k.namn_id = n.N_namn_id AND k.datum = n.N_datum" & vbCrLf & _ 
          " WHERE k.namn_id = " & Id & " AND k.datum = #" & d & "#"

Posterna som ligger i "weight-tabellen" syns om det är någon annan händelse i calendar tabellen med samma datum.

Men inte om det endast är en post på ett visst datum i weight-tabellen.
Konstigt!

Jesper TMedlem sedan nov. 20017 144 inlägg
#13

Antagligen är jag dum i huvudet men det ända som skall vara lika i samtliga tabeller som skall hämtas är ju datumet och id:t.
Om så är fallet så skall de posterna skrivas ut, en post i weight, notes eller calender så skall detta skrivas ut på aktuellt datum.
De skall inte på annat sätt vara beroende av varandra.
Nu så skrivs weight ut endast om calender har en post med samma kriterier, det är FEL!

Hur gör man det?

Så här såg det ut förut men då blir det ju RIKTIGT fel:

SQL="select w.*,k.*,n.* "&_ 
" from Weight w,Calendar k,Notes n "&_ 
" where k.namn_id = w.W_per_id AND k.datum = w.W_date"&_ 
" or k.namn_id = n.N_namn_id AND k.datum = n.N_datum"&_ 
" or k.namn_id = " & Id & " AND k.datum = #" & d & "#"
LarsGMedlem sedan dec. 200012 464 inlägg
#14

Det verkar suspekt detta. Om du ändrar så att du har en inner join mellan kalender och weight då?

Jesper TMedlem sedan nov. 20017 144 inlägg
#15

Glöm all tidigare kod.(Jag vet inte vad jag håller på med) :l

Jag skulle villja få ut alla poster ifrån calender, weight, notes som har samma id och datum. Ingen av tabellerna skall ha något annat gemensamt än att id´t och datumet skall vara de samma.
Låt säga att jag har dessa poster i Arnes loop.(Arne har tex id=22)

2002-11-04
Notes: Här är en dum text...
Weight: 100kg

2002-12-05
Weight: 99kg

2002-12-08
Weight: 98kg
Calender: Tandläkaren

Varje datum skall kunna skriva ut poster ur samtliga tabeller om datumet är det samma.

LarsGMedlem sedan dec. 200012 464 inlägg
#16

I så fall borde det bli en vanlig inner join

SQL="select w.*,k.*,n.* "&_ 
" from Weight w,Calendar k,Notes n "&_ 
" where k.namn_id = w.W_per_id AND k.datum = w.W_date"&_ 
" and k.namn_id = n.N_namn_id AND k.datum = n.N_datum"&_ 
" and k.namn_id = " & Id & " AND k.datum = #" & d & "#"
Jesper TMedlem sedan nov. 20017 144 inlägg
#17

Nej, nu visas posterna endast om alla uppfyller samma kriterier.
Weights kan stå enskilt, calender kan stå enskilt och notes kan stå enskilt.

Och i alla möjliga grupperingar.

weights, notes
notes,calender,weights
notes
calender,weights
calender
weights
osv...(Med risk för att bli övertydlig) .... ;)

Nu blir det ju(som är fel, fel, fel)

weight,calender,notes

(Det datumet hade alla matchande poster)

LarsGMedlem sedan dec. 200012 464 inlägg
#18

Med dom förutsättningarna kan du inte göra en join.

Det ser mer ut som 3 olika frågor eller så kan du göra en union

select 'weight',weigth,'d' as notes ,datum from weight  
where datum = #d# and id = 22
union
select 'notes' , 1, notes, datum from notes
where datum = #d# and id = 22
union
select 'kalender' , 1, kalender, datum from kalender
where datum = #d# and id = 22
order by datum

Du måste ha samma antal kolumner i varje select och värdena måste vara kompatibla. (därför 'd' och 1)

Jesper TMedlem sedan nov. 20017 144 inlägg
#19

Oj, nu blev det mycket, men jag tror att vi är på rätt spår.
Är det prestandamässigt sämre att ha tre frågor i stället för unions?

Fattar inte riktigt vad 'd' och 1 gör.

LarsGMedlem sedan dec. 200012 464 inlägg
#20

Nej, i och med att du läser i tre olika tabeller så tror jag inte att det har så stor betydelse vilket du väljer.

'd' och 1 är bara till för att de olika delfrågorna skall få kolumner av samma typ

Det går inte att skriva en fråga som

  select integerKolumn from t1
  union
  select charKolumn from t2

Då kan man lägga till konstanter så att det blir jämförbara värden

  select 'd',integerKolumn from t1
  union
  select charKolumn,1 from t2

Konstanten 'd' är jämförbar med charkolumnen i den andra frågan och integerKolumn är jämförbar med 1 i den andra frågan.

Om du väljer en lösning med union så använd

UNION ALL

det är effektivare eftersom union innebär att man tar bort dubletter vilket man inte gör med UNION ALL. För att ta bort dubletter så brukar man använda en temporärtabell vilket är rätt så kostsamt.

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