Avatar billede merada Nybegynder
16. maj 2006 - 10:48 Der er 55 kommentarer og
1 løsning

Sql, alias eller correlation Name?? HJÆLP..

Beder om lidt hjælp. -Har læst hvad jeg kunne finde om correlations names og alias's da jeg vil lave 3 udtræk fra samme tabel.

Jeg får syntaksfejl og ved ikke hvordan jeg skal løse problemet.
Min sql ser nu således ud:

SELECT TOP 100 PERCENT dbo.tblHandel.*, dbo.tblTing.*, dbo.tblFirma.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.ejer AND
tblHandel.operatør AND tblFixture.operatørejer

Nogen som kan hjælpe?
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 12:51 #1
SELECT TOP 100 PERCENT
dbo.tblHandel.*, dbo.tblTing.*, dbo.tblFirma.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.ejer

- hertil er det godt nok

... AND tblHandel.operatør AND tblFixture.operatørejer

Det er forkert
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 12:52 #2
Hvad er det du vil? Jeg kan ikke se at du forsøger dig med ALIAS.

Er tblHandel, tblTing og tblFirma i virkeligheden den samme tabel, eller hvad?
Avatar billede fennec Nybegynder
16. maj 2006 - 12:59 #3
.. Og hvilken syntaxfejl får du?? Det indsnæver fejlsøgning betydligt hvis du leverede den, da vi jo ikke kan gætte hvor problemet er. Det kunne jo være noget så simpelt som en stavefejl :o)
Avatar billede merada Nybegynder
16. maj 2006 - 13:03 #4
Tak for response:-)

SELECT TOP 100 PERCENT
dbo.tblHandel.*, dbo.tblTing.*, dbo.tblFirma.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.ejer

-Dertil virker min sql også.. Problemet opstår når jeg prøver at AND'e operatør og operatør ejer.

nej, tblHandel, tblTing og tblFirma er ikke den samme tabel.

Jeg har ejer, operatør og operatørejer i tblHandel (representeret ved tal) og vil hente deres navne i tblFirma og det er der den går gal!

Jeg har forsøgt mig med alias, men får også syntaksfejl - så her beder jeg om hjælp.
Avatar billede merada Nybegynder
16. maj 2006 - 13:03 #5
Giver det mening?
Avatar billede sw_red_6 Nybegynder
16. maj 2006 - 13:04 #6
Det er nok fordi du ikke kan bruge æøå
Avatar billede merada Nybegynder
16. maj 2006 - 13:11 #7
Jeg har omdøbt tabelnavne - jeg bruger ikke æøå;-)
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 13:24 #8
Hvad har alt dette med ALIAS og CORRELATION at gøre?

Men ok, den sidste del, den der fejler siger:

... AND tblHandel.operatør AND tblFixture.operatørejer

Hvad vil du med den del?
Skulle det måske være:
... WHERE tblHandel.operatør = tblFixture.operatørejer

Eller sådan noget?
Men det der fejler helt er at du henviser til tblFixture, som ikke er med i din FROM.
Avatar billede merada Nybegynder
16. maj 2006 - 13:26 #9
Ligenu får jeg på mit udtræk vist navnet på ejer, men tallene representeret i tblHandel istedet for NAVNET på operatør og operatørejer!
Avatar billede merada Nybegynder
16. maj 2006 - 13:32 #10
Okay, nu er min forklaring måske også lidt roddet - sorry.. Det jeg vil:

SELECT TOP 100 PERCENT dbo.tblHandel.*, dbo.tblTing.*, dbo.tblFirma.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma ON tblfirma.ID = tblHandel.operatørejer

Så jeg får vist navnet på ejer, operatør, og operatørejer i mit udtræk:-)

Hvis jeg prøver dette, - får jeg en fejl som siger: vælg correlationnavn for tabel.
-Derfor min snak om alias og correlationnavn;-)
Avatar billede merada Nybegynder
16. maj 2006 - 13:36 #11
IdaNielsen - jeg har omdøbt tabelnavne for at fremme forståelsen. Når jeg så glemmer dem alle, så skaber det jo forvirring:-( Sorry.

Se den ovenstående kommentar, håber det giver lidt mere mening i forhold til hvad jeg vil!
Avatar billede fennec Nybegynder
16. maj 2006 - 13:42 #12
Ok, så det er noget i denne stil du søger:

SELECT TOP 100 PERCENT fEjer.name as name1, fOperator.name as name2, fOprEjer.name  as name3
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma fEjer ON fEjer.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma fOperator ON fOperator.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma fOprEjer ON fOprEjer.ID = tblHandel.operatørejer
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 13:51 #13
OK, så giver det mening!

Du har tre referencer til tblFirma, og de skal have hver deres alias (her f1, f2 og f3):

SELECT TOP 100 PERCENT dbo.tblHandel.*, dbo.tblTing.*, f1.*, f2.*, f3.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma f1 ON tblfirma.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma f2 ON tblfirma.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma f3 ON tblfirma.ID = tblHandel.[operatørejer]

nui mangler du bare at droppe alle de stjerner, og kun select'e det du faktisk skal bruge.

Du har stadig et ø i et feltnavn, så jeg har sat [] omkring det
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 13:51 #14
fennec var først, og han har også vist dig at bruge alias'er på feltnavne ...
Avatar billede fennec Nybegynder
16. maj 2006 - 14:01 #15
Angående * i select listen, så vil jeg anbefale at du ikke bruger det på mere end en tabel. Det giver nemt problemer.

select table1.*, tabel2.* <-- Ikke godt
select table1.*, table2.col1, table2.col2  <-- OK
select table1.*, table2.col1 as aliasNavn1, table2.col2 as aliasNavn2 <-- Super godt
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 14:12 #16
der er en fejl i mit:

SELECT TOP 100 PERCENT dbo.tblHandel.*, dbo.tblTing.*, f1.*, f2.*, f3.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma f1 ON f1.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma f2 ON f2.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma f3 ON f3.ID = tblHandel.[operatørejer]
Avatar billede merada Nybegynder
16. maj 2006 - 14:18 #17
Tak fordi i hjælper..

IdaNielsen; Jeg trækker alt ud, da jeg skal bruge data på anden måde også. -HER vil jeg bare kun udskrive ejer, operatør og operatørejer - derfor gjort sådan (feltnavne er også omdøbt;-) -så ingen æøå)

-Hvis jeg bruger dit eks. får jeg en syntaksfejl, 'tblfirma matcher ikke tabel eller alias navn brugt i query'. Hvad gør jeg forkert?

Nu prøver jeg lige om jeg kan gennemskue fennecs..
Avatar billede merada Nybegynder
16. maj 2006 - 14:23 #18
IdaNielsen - du havde jo svaret på mit næste spg;-) Så nu ved jeg da hvorfor jeg får fejl. Men efter at have rettet til får jeg endnu en fejl.
ID skal være unik. (f1.ID)
Skal ID så også have et alias??
Avatar billede merada Nybegynder
16. maj 2006 - 14:25 #19
fennec: Jeg skal 'oppe' mig og skrive min sql korrekt, så tak fordi du viser mig det:-)
Men hvad er årsagen egentlig til at select * kun er 'OK' på een tabel?
Avatar billede ldanielsen Nybegynder
16. maj 2006 - 14:41 #20
Jeg skal se præcis hvad du har skrevet for at regne ud hvad der giver fejlen. Men måske fennec vil "køre den hjem", han var jo først, mest korrekt, og er klar til at give dig videre vejledning, som jeg lytter interesseret til.

Personlig bruger jeg ikke *, undtagen når jeg er ved at udvikle. I min færdige SQL er alle felter nævnt, uanset at der er mange. Dovenskab er ikke et argument for at vælge en bestemt syntaks. :o)
Avatar billede fennec Nybegynder
16. maj 2006 - 14:42 #21
Forstil dig denne opbygning:
[brugerTabel]
id, navn, gruppeID

[gruppeTabel]
id, navn

Med: "select brugerTabel.*, gruppeTabel.* from brugerTabel inner join gruppeTabel on gruppeTabel.id = brugerTabel.gruppeID" vil du få data ud med disse navne:

id, navn, gruppeID, id, navn

Dette skaber problemer nå du i dit program (VB, ASP osv.) skal trække informationerne ud, da du ikke har entydigt navn på kolonnerne.
response.write rs("navn") <-- Er det bruger eller gruppe navn??

SQL'en skulle i stedet have været:
"select brugerTabel.*, gruppeTabel.navn as gruppeNavn from brugerTabel inner join gruppeTabel on gruppeTabel.id = brugerTabel.gruppeID"

Da listen så bliver:
id, navn, gruppeID, gruppeNavn (ingen kolonne navne går igen)

Det handler altså om at kolonnerne på din select liste har et entydigt navn. Det kan selvfølgelig også løses ved anden navngivning af kolonnerne:

[brugerTabel]
brugerID, brugerNavn, brugerGruppeID

[gruppeTabel]
gruppeID, gruppeNavn

Da du på denne måde får unikke kolonne navne, også kan du godt bruge * på flere tabeller...
Avatar billede fennec Nybegynder
16. maj 2006 - 14:48 #22
... Men som ldanielsen, holder jeg mig også helst helt fra *. Jeg er dog ikke helt hysterisk med det, så skal jeg have en stor del af felterne fra en tabel udskrevet, bruger jeg gerne *.
Avatar billede fennec Nybegynder
16. maj 2006 - 14:55 #23
Og et svar.
.o) <-- One Eyed Jack
Avatar billede merada Nybegynder
16. maj 2006 - 15:01 #24
IdaNielsen; Jeg har simpelthen kopieret dit eksempel:

SELECT TOP 100 PERCENT dbo.tblHandel.*, dbo.tblTing.*, f1.*, f2.*, f3.*
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma f1 ON f1.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma f2 ON f2.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma f3 ON f3.ID = tblHandel.operatørejer

Når jeg gør dét, får jeg fejlen; 'kolonnenavne skal være unikke. Kolonne ID er brugt mere end een gang'.

fennec: Tak for eksemplet, jeg kan sagtens følge dig, men det duer ikke at jeg begynder at omdøbe mine kolonnenavne - så min løsning må blive at lave entydige navne. Jeg skal lige bruge lidt tid på det, da jeg snart ikke kan overskue det mere
:-/

Jeg håber da stadig at også du, IdaNielsen, vil følge/hjælpe med?
Avatar billede merada Nybegynder
16. maj 2006 - 15:11 #25
fennec: Nu troede jeg lige jeg havde løsningen, men bliver lidt forvirret!

Nu har jeg jo alias for de 3 gange jeg vil bruge min tblFirma, hvad så?
Er løsningen så: select f1.ID as ID1 from F1 INNER JOIN tblHandel ON f1.ID1 = tblHandel.ejer
osv???????
Avatar billede fennec Nybegynder
16. maj 2006 - 15:15 #26
Ja, noget i den stil:

select f1.id as ID1, f2.id as ID2, f3.id as ID3
FROM tblHandel LEFT OUTER JOIN
tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
tblFirma f1 ON f1.ID = tblHandel.ejer LEFT OUTER JOIN
tblFirma f2 ON f2.ID = tblHandel.operatør LEFT OUTER JOIN
tblFirma f3 ON f3.ID = tblHandel.operatørejer
Avatar billede merada Nybegynder
16. maj 2006 - 15:42 #27
oooooh, altså.. Det var jo også hvad jeg kunne forestille mig og hvad jeg har gjort.
MEN næste syntaksfejl: Count field incorrect or syntax error!!!

Hvad betyder nu det?
Avatar billede merada Nybegynder
16. maj 2006 - 15:46 #28
Jeg havde lavet en lille fejl, ups.. Den er nu rettet men jeg får stadig fejl:
'Invalid columnname ID1, ID2 and ID3'
Avatar billede fennec Nybegynder
16. maj 2006 - 16:04 #29
Smid lige hele din SQL sætning herind, som du har den nu (med Where, Order by og hvad der eller er)
Avatar billede merada Nybegynder
16. maj 2006 - 16:09 #30
Nå, men jeg går ud af at jeg skulle skrive
select tblFirma f1.ID AS ID1, tblFirma f2.ID AS ID2, tblFirma f3.ID AS ID3 FROM....

Men gør jeg det får jeg en syntaxerror: Incorrect syntax near '.'. ( i min select linie)

Jeg kan umiddelbart ikke se nogen fejl!?
Avatar billede fennec Nybegynder
16. maj 2006 - 16:21 #31
Du giver tabellen et alias (kaldeNavn) i din FROM del. Det navn bruges så ALLE steder i stedet for tabelNavnet:
select AliasNavn.id, AliasNavn.navn from brugerTabel AliasNavn order by AliasNavn.navn

Du skal derfor bare kalde:
select f1.ID AS ID1, f2.ID AS ID2, f3.ID AS ID3 FROM

Den ved godt at f1 er tblFirma tabellen da det er defineret i:
tblFirma f1 ON f1.ID = tblHandel.ejer LEFT OUTER JOIN
Avatar billede merada Nybegynder
16. maj 2006 - 16:32 #32
okay.. Men når jeg gør det får jeg fejlen, som også skrevet i det ovenstående:
'Invalid columnname ID1, ID2 and ID3'
Avatar billede fennec Nybegynder
16. maj 2006 - 16:48 #33
Så smid lige HELE din sql sætning herind som den er nu. Kan ikke tro det kun er de 6 linjer du har, for de ser OK ud nu. Har du ikke en where og order by del også??
Avatar billede merada Nybegynder
16. maj 2006 - 17:00 #34
SELECT    TOP 100 PERCENT tblHandel.*, tblTing.*, f1.ID AS ID1, f2.ID AS ID2, f3.ID AS ID3
FROM        tblHandel LEFT OUTER JOIN
                      tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
                      tblfirma f1 ON f1.ID1 = tblHandel.ejer  LEFT OUTER JOIN
                      tblFirma f2 ON f2.ID2 = tblHandel.operatør  LEFT OUTER JOIN
                      tblFirma f3 ON f3.ID3 = tblHandel.operatørejer 


WHERE      (tblHandel.Type = 1)  AND (tblHandel.date IS NULL)



ORDER BY tblTing.TingName
Avatar billede merada Nybegynder
17. maj 2006 - 08:43 #35
fennec: Hvad siger du til det? Kan du gennemskue fejlen?
Avatar billede fennec Nybegynder
17. maj 2006 - 08:47 #36
Det skal ikke være f1.ID1, det skal bare være f1.ID:

SELECT    TOP 100 PERCENT tblHandel.*, tblTing.*, f1.ID AS ID1, f2.ID AS ID2, f3.ID AS ID3
FROM        tblHandel LEFT OUTER JOIN
    tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
    tblfirma f1 ON f1.ID = tblHandel.ejer  LEFT OUTER JOIN
    tblFirma f2 ON f2.ID = tblHandel.operatør  LEFT OUTER JOIN
    tblFirma f3 ON f3.ID = tblHandel.operatørejer 
WHERE      (tblHandel.Type = 1)  AND (tblHandel.date IS NULL)
ORDER BY tblTing.TingName
Avatar billede merada Nybegynder
17. maj 2006 - 08:59 #37
hmm.. Når jeg har rettet til får jeg fejlen: Ambiguous column name 'ID'!?
Avatar billede fennec Nybegynder
17. maj 2006 - 09:04 #38
Hvordan ser SQL'en så ud nu??
Avatar billede merada Nybegynder
17. maj 2006 - 09:11 #39
okay, da jeg gik sql'en igennem så jeg min fejl, jeg har nu sql'en rettet igennem og får ikke flere (syntax) fejl...

Jeg er lidt forvirret over de her alias's! Hvad skal jeg bruge i min kode?
response.write ?? (for at skrive navnene ud)
Avatar billede merada Nybegynder
17. maj 2006 - 09:20 #40
ja, jeg ved ikke om spg er dumt, men jeg får bare en fejl; 'Item cannot be found in the collection corresponding to the requested name or ordinal'. på 'operatør'
Avatar billede fennec Nybegynder
17. maj 2006 - 09:36 #41
Som det er nævnt tidligere, er det ikke godt at bruge æøå i tabel/kolonne navne. Så det vil være en god ide at omdøbe dem.

Har du en kolonne i tblHandel der hedder "operatør"? Tjek stavning grundigt...
Avatar billede merada Nybegynder
17. maj 2006 - 10:09 #42
Jeg ved sq ikke om jeg bare gør det her skrupforkert! (det var en stavefejl og jeg har ikke længere nogle fejl.
Men mit output består stadigvæk bare af tallet repræsenteret i tblHandel, istedet for selve navnet som jeg jo prøver at hente i tblFirma!
Avatar billede merada Nybegynder
17. maj 2006 - 10:20 #43
Når jeg lige tænker mig om:

Jeg sætter tblFirma ID 1 og 2 og 3 = tblHandel ejer operatør og operatørejer
men jeg nævner jo ingen steder kolonnen tblFirma NAVN (Jeg har ikke længere nævnt den i min select, da vi jo har lavet * om til selve kolonne navnene) - som jo er det jeg vil have skrevet ud.

Men hvad gør jeg så?
Avatar billede fennec Nybegynder
17. maj 2006 - 10:27 #44
Du skal selecte navnet i stedet for ID'et:

SELECT    TOP 100 PERCENT tblHandel.*, tblTing.*, f1.Navn AS navn1, f2.navn AS navn2, f3.navn AS navn3
Avatar billede merada Nybegynder
17. maj 2006 - 10:34 #45
Det har jeg gjort nu, men får stadig bare vist tallet. Skal jeg gøre noget ved min 'FROM'???
Avatar billede fennec Nybegynder
17. maj 2006 - 10:41 #46
Nej.
Avatar billede fennec Nybegynder
17. maj 2006 - 10:42 #47
Hvordan ser SQL'en ud nu??
Avatar billede merada Nybegynder
17. maj 2006 - 10:47 #48
SELECT    TOP 100 PERCENT tblHandel.*, tblTing.*, f1.Navn AS Navn1, f2.Navn AS Navn2, f3.Navn AS Navn3
FROM        tblHandel LEFT OUTER JOIN
    tblTing ON tblHandel.ting1 = tblTing.ID LEFT OUTER JOIN
    tblfirma f1 ON f1.ID = tblHandel.ejer  LEFT OUTER JOIN
    tblFirma f2 ON f2.ID = tblHandel.operatør  LEFT OUTER JOIN
    tblFirma f3 ON f3.ID = tblHandel.operatørejer 
WHERE      (tblHandel.Type = 1)  AND (tblHandel.date IS NULL)
ORDER BY tblTing.TingName
Avatar billede merada Nybegynder
17. maj 2006 - 10:49 #49
Men jeg forstår ikke helt:

Jeg sætter tblfirma f1 ON f1.ID = tblHandel.ejer, Osv..
-Det er jo også det jeg vil, men jeg har ikke nogen 'forbindelse' imellem; Navn & tblfirma f1 ON f1.ID = tblHandel.ejer
Avatar billede merada Nybegynder
17. maj 2006 - 10:53 #50
og i min kode skriver jeg:
response.write ejer, operatør og operatørejer

-Men får stadig bare vist tallet..
Avatar billede merada Nybegynder
17. maj 2006 - 10:56 #51
okay:-) :-) NU har jeg fundet ud af at rette hvad som jeg gjorde forkert...
Jeg bukker, takker, siger tak for hjælpen og lukker her.

(må jeg evt. spørge efter dig en anden gang;-))
Avatar billede fennec Nybegynder
17. maj 2006 - 11:04 #52
Du spørg bare.

.o) <-- One Eyed Jack
Avatar billede merada Nybegynder
17. maj 2006 - 11:06 #53
sidste spg. (lidt noget andet)

du husker: WHERE      (tblHandel.Type = 1)  AND (tblHandel.date IS NULL) ?

Jeg får vist nogle enkelte hvor jeg har en dato i 'date'. Har du en idé til hvorfor?
Avatar billede fennec Nybegynder
17. maj 2006 - 11:09 #54
Det burde ikke kunne lade sig gøre med den betingelse du har der.
Har du en dato i tblTing tabellen?? For det kan være den du får udskrevet istedet.
Avatar billede merada Nybegynder
17. maj 2006 - 11:11 #55
hmm.. Men jeg laver en response.write på kolonnen, blot for at kunne se at der er ingenting! -Så bør det vel ikke kunne være en anden kolonnedate som jeg får vist??
Avatar billede fennec Nybegynder
17. maj 2006 - 11:32 #56
Jo, det hænger sammen med den problemstilling jeg beskrev 16/05-2006 14:42:47.
Er der flere kolonner, der hedder det samme, vil den udskrive den sidste forkomst af kolonnen.

F.eks:
select tabel1.dato, tabel2.dato ...

Her vil en udskrift af "dato" give mig tabel2.dato.

Hvilket sprog har du lavet dit program i, som henter oplysningerne (PHP, VB, ASP...)??
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
Computerworld tilbyder specialiserede kurser i database-management

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