13. juni 2001 - 20:41Der er
24 kommentarer og 2 løsninger
JOIN
Jeg troede jeg kunne lave det med en triviel JOIN men kan ikke lige få det til at fungere. Jeg har en tabel med en masse fugle og et id. Så har jeg en user tabel med username og userid. Så har jeg endnu en tabel med sammenkoblingen mellem fugle og user, så man kan se hvilke fugle en bruger har set.
Jeg skal bruge en liste med alle fugle, og samtidig et felt der fortæller om en bruger har set den. Følgende giver kun der fugle han har set:
SELECT bird.name, hit.userid FROM bird LEFT JOIN hit ON bird.birdid = hit.birdid where hit.userid = 1
Hvordan får jeg alle andre med, og hvor hit.userid = null.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
det er jo utroligt hvad ornitologer roder sig ind i.!!!
Så vidt jeg kan se, er der en grundlæggende fejl i din database:
I tabellen \"fugle\" har du et id! I tabellen \"user\" har du også et id!!
Disse id er forskellige, så databasen kan ikke umiddelbart sammenligne dem.
I tabellen \"fugle\" bør du lave feltet fugle til tabellens primære nøgle, idet du jo ikke vil have den samme fugl 2 gange.
Det samme i tabellen \"user\", du har kun een user med det samme navn.
Når du har gjort dette, skal du betragte disse tabeller som \"opslagsværker\", og i en 3. tabel der omhandler hvilke ornitologer der har set hvilke fugle, ved hjælp af kombinationsbokse plukke relevante oplysninger fra tabellerne. Denne 3. tabel skal ikke have nogen primær nøgle.
Herefter trækker du i databasens relationsvindue de relevante relationer.
Jeg er overbevist om, at dit problem kan løses ved en ændring af databasens grundlæggende konstruktion. Dette vil komme dig tilgode senere hen.
Hvis din database er i Access 97, er du velkommen til at maile den til mig, så skal jeg se på den.
Jeg har som du siger en primær nøgle både i user og bird tabellen. Desuden ingen i hit-tabellen der binder dem sammen. Jeg kan ikke rigtig forstå, hordan du kan se jeg ikke har det? :)
Som jeg læser det har Stig en sådan tabel som kaldes Hit.
Man kan få præsenteret datane i tabellen Hit på en smart måde vha krydstabulering.
TRANSFORM Count(Hit.Birdid) AS AntalOfBirdid SELECT Hit.Birdid FROM Hit GROUP BY Hit.Birdid PIVOT Hit.userID;
Denne forespørgsel vil lave en kolone med alle dine fugle som række overskrift - Brugerne bliver listet op som koloneoverskrifter - Antal \"Hit\" vil placeres i de respektive felter.
SQL\'en er skrevet direkte ind, og skal måske rettes en smule - evt kan du joine de 2 andre tabeller ind således at Fuglenavnene og usernavnene skrives rigtig istedet for IDfelterne. Prøv at lege lidt med krydstabulering - Den er god i alle tabeller med mange fremmednøgler.
nih> Ser smart ud og det virker også. Viste ikke man kunne dette. Er det ACCESS eller stadard SQL?
Men jeg kan ikke sætte en WHERE part på hvori jeg specificerer et userid. Det giver samme problem som min JOIN. Jeg mister fuglene som det angivet userid ikke har set.....
Krydstabulering er foresten en speciel ACCESS SQL komando - Jeg kender den ikke fra SQL server, men det er også mest Access jeg bruger så måske er den gangbar i andre miljøer.
Du kan jo bagefter bruge din krydstabulering i andre forespørgsler og få (næsten) præcis det udtræk du vil have.
den har jeg også prøvet. Men den virker ikke, for hvis en anden user, har set den fugl, så står der ikke null, men hans userid, og så fanger \"isNull\" den ikke.
Har Mugs løst problemmet, så vil jeg gerne høre de vise ord. Jeg holder mig til min krydstabulering man kan jo trække MAX(datofelt) med som rækkeoverskrift.
Tabellen \"hit\" er beregnet til at indtaste oplysninger om hvornår en user har set en fugl. Som du har skrevet i din sidste kommentar, forstår jeg det sådan, at du vil have oplysninger om hvornår en user ikke har set en fugl, og det er jo det modsatte af dit oprindelige spørgsmål. Og det kan jeg ikke rigtig se nogen mening i.
Desuden mener jeg at udtrykket \"isNull\" er en betingelse du kan programmere i VBA, men ikke i en tabel.
Jeg ønsker et udtræk, der giver alle fuglene i tabellen. Dvs bare alle birdid\'er. Jeg ønsker dog lidt mere. Jeg ønsker at der for alle rækker, også fortælles om en bestemt user har set denne fugl.
følgende gemmes som Q_Kryds: TRANSFORM Count(Hit.Birdid) AS AntalOfBirdid SELECT bird.Birdid, Max(Hit.dato) AS maxdato FROM bird LEFT JOIN Hit ON bird.BirdID = Hit.Birdid GROUP BY Hit.Birdid PIVOT Hit.userID;
Herefter opretter du endnu en forespørgsel
select top 2 birdid, maxdato, 1 from Q_kryds order by maxdato;
er der copyright på dit musik kartotek som jeg fik igår - Hvis jeg vil bruge det bliver det kun internt hvor jeg arbejder - har du noget imod det ????? Det er et flot stykke arbejde du har lavet!!!
Jeg har haft meget glæde af det på mit arbejde - så hvis du kan bruge det, er jeg tilfreds med det.
De første lektioner er jo noget tørt stof, men jeg har gjort en del ud af det fordi jeg af erfaring ved, at mange nye brugere springer det grundlæggende over, og går til det mere sjove som f.eks at få nogle smarte features / farver på formularer.
Mit kendskab til SQL og VBA og al det andet djævelskab I sidder og roder med er meget begrænset, men det grundlæggende med design af tabeller og relationer:
det er mig
Har du brug for yderligere materiale, skal du blot maile til mig:
Jeg er ked af at sige det, men jeg mener ikke jeg har fået svar på nogen af mine spørgmål.
nih >> Dit med at finde de to nyeste fugle for hver person, virker ikke. Dit maxdato giver kun 1 dato per fugle, og jeg skulle gerne have end dato per fugl per mand, for atkunne finde de to nyeste.
Med hensyn til min database opbygning har jeg oprettet det her spørgsmål:
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.