16. maj 2006 - 10:48Der 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
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
.. 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)
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.
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;-)
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
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
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
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]
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..
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??
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?
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)
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:
... 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 *.
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?
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???????
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
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
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å??
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)
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
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'
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!
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.
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
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
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??
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...)??
Synes godt om
Ny brugerNybegynder
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.