Jesper TMedlem sedan nov. 20017 144 inlägg
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 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
LarsGMedlem sedan dec. 200012 464 inlägg 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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.