18. februar 2008 - 23:01Der er
7 kommentarer og 1 løsning
returnere en post selvom
Hejsa.
Jeg har et lille problem med nedenstående kode
'SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client) WHERE B.Client = '+DataM.ClientSql.FieldByName('Nummer').AsString+' AND R.Berth = B.Berth ORDER BY Berth';
Denne kode returnere med en post, når der er en passende post i begge tabler, men jeg vil gerne lave samme søgning, men bare således at jeg altid får en post, også selvom om der ikke findes en passende post i bortreg.
(Brug parametre i stedet for direkte formaterede sql-scripts)
SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client) WHERE (B.Client = :Client) AND (R.Berth = :Berth) ORDER BY Berth
Problemet er din "and (R:Bert = :Bert)" der kræver opslag i Bert. Mon ikke det omdefinerer din left join til en join. Arne har sikkert en kommentar til den teori.
Har du prøvet dette her:
SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client and R.Berth = :Berth) WHERE (B.Client = :Client) ORDER BY Berth
Jeg mener godt man må angive parametre i en join - om ikke andet må du lave scriptet uden de ellers anbefalelsesværdige parametre.
SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client AND R.Berth = B.Berth) WHERE B.Client = :Client ORDER BY Berth
SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client AND R.Berth = B.Berth) WHERE (B.Client = :Client) ORDER BY B.Berth
Du sætter parametrene sådan:
Query.SQL.Text := 'SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth'+ ' FROM berth B'+ ' LEFT JOIN boatreg R on (R.Client = B.Client AND R.Berth = B.Berth)'+ ' WHERE (B.Client = :Client)'+ ' ORDER BY B.Berth';
(du havde glemt B-referencen i din "order by")
// Den letteste og lidt usikre metode: Query.Parameters.ParamByName('Client').Value := 1;
// Den lidt mere besværlige, men helt sikre (kan pakkes ind i en funktion så det bliver en en-linje operation): with Query.Parameters.ParamByName('Client') do begin DataType := ftInteger; ParamType := ptInput; Value := 1; end;
Den omdefinerer ikke en LEFT JOIN til en INNER JOIN, men men men:
R.Berth = B.Berth
matcher aldrig når R.Berth er NULL !
SELECT B.Client, B.Berth, B.Width, B.Length, B.Depth FROM berth B LEFT JOIN boatreg R on (R.Client = B.Client) WHERE B.Client = '+DataM.ClientSql.FieldByName('Nummer').AsString+' AND (R.Berth IS NULL OR R.Berth = B.Berth) ORDER BY Berth;
Jeg har skrevet koden om efter hrc, og det fungere.... er også begyndt ændre min kode således at jeg param, det giver jo noget mere skrivearbejde, jeg kan da godt se at det i nogen tilfælde er en sikre måde..
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.