Avatar billede fhansen Praktikant
18. februar 2008 - 23:01 Der 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.

Hansen
Avatar billede arne_v Ekspert
18. februar 2008 - 23:25 #1
Det burde du fda også få med LEFT JOIN !?!?
Avatar billede hrc Mester
19. februar 2008 - 09:43 #2
(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.
Avatar billede hrc Mester
19. februar 2008 - 09:45 #3
Min fejl. Der er kun én parameter i dit script

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
Avatar billede hrc Mester
19. februar 2008 - 09:49 #4
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;
Avatar billede arne_v Ekspert
20. februar 2008 - 04:18 #5
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;

Men altså parametre er 799 gange pænere så ....
Avatar billede fhansen Praktikant
27. februar 2008 - 22:08 #6
Damn mente jeg havde svaret på dette....

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..


points ???
Avatar billede hrc Mester
29. februar 2008 - 21:26 #7
Hvad siger du Arne? Har du et bud på Finns nye spørgsmål?
Avatar billede arne_v Ekspert
01. marts 2008 - 00:09 #8
Ikke rigtigt
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
Kurser inden for grundlæggende programmering

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