Hej, Det kan vara lämpligt att berätta vilken db-motor du har (MS SQL? MySQL?) Jag hade ju tänkt att det skulle lösas med SQL, varför sql motor inte har betydelse. Alltså ingen cursor och liknande, vill helst undvika allt sånt. Databasmotorn/-hanteraren kan ha betydelse eftersom syntax och stöd för olika saker tyvärr skiljer sig mellan olika databasmotorer. Hej. TKontakt: Tackar och buggar för förslagen, de är till stor nytta, när jag ska skriva om en del processer.XOR selecting i en och samma sats?
Har ett trevligt problem, jag tror att det är ganska vanligt, varför chansen att någon redan har löst det är stor.
Säg att man har två tabeller TKontakt och TAdress, varje kontakt kan ha en eller flera adresser i TAdress tabellen. Ett vanligt scenario, eller hur. Varje adress post har ett id-fält som talar om vad det är för typ av adress, exvis 1=privat, 2=arbete.
Jag vill i en och samma SQL-sats hämta alla kontakter med privat adress om de har, har de ingen vill jag att arbetsadressen ska hämtas istället. Hur göres detta?
Ett alternativ som är omständigt och jobbigt är att först lista alla privata allena och sedan köra en UNION med arbetsadresserna, men det är inte tillräckligt tjusig lösning. Delvis pga att jag i min problemställning har en hel del variabler till att ta hänsyn till varför den blir mycket komplex lösning. Jag samkör det med en del andra tabeller, men det skulle göra problemet smått jobbigt här på forumet om jag skrev det i sin helhet.
Tacksam för svar.Sv: XOR selecting i en och samma sats?
Sv: XOR selecting i en och samma sats?
Pelle, jag förstod inte ditt svar. Alltså jag vill att satsen ska välja privat-adressen om kontakten har en sån, finns ingen sån, ska arbetsadressen väljas.
Och det ska göras i en SQL-sats, inte i en lagrad procedur. Är det möjligt?Sv: XOR selecting i en och samma sats?
Sv: XOR selecting i en och samma sats?
Här kommer en SQL som jag tror motsvarar vad du menar.
Jag är inte helt hundra på vad du menar när du säger "...ingen cursor..."
eftersom en cursor bara är ett "handtag" från ditt program till en SQL på
databassidan (ungefär).
Denna SQL påvisar dessutom att vilken typ av databas har betydelse.
Detta är en Oraclevariant:
select k.id, k.namn, nvl(a1.adress, a2.adress) adress
from tkontakt k, tadress a1, tadress a2
where k.id = a1.kontakt_id (+)
and a1.adress_typ (+) = 1
and k.id = a2.kontakt_id (+)
and a2.adress_typ (+) = 2
Tkontakt:
ID NAMN
1 Uffe
2 Kalle
Tadress:
KONTAKT_ID ADRESS_TYP ADRESS
1 1 hemgatan
1 2 jobbargatan
2 2 jobbsovargatan
Svar:
ID NAMN ADRESS
1 Uffe hemgatan
2 Kalle jobbsovargatanSv: XOR selecting i en och samma sats?
KontaktId KontaktNamn
1 Uffe
2 Kalle
TAdress:
AdressId AdressKontakt AdressTyp Adress
1 1 1 hemgatan
2 1 2 jobbargatan
3 2 2 jobbsovargatan
SELECT TKontakt.*, (SELECT TOP 1 TAdress.Adress
FROM TAdress
WHERE TAdress.AdressKontakt = TKontakt.KontaktId
ORDER BY TAdress.AdressTyp)
FROM TKontaktSv: XOR selecting i en och samma sats?
Om man spekulerar mer i prestanda, är det någon som har åsikt om vad som lämpar sig bättre än det andra?
Att köra ren SQL eller bland in pekare och iterationer i satsen? Iterationer kräver ju det faktum att man radvis ser på värdet och eventuellt mellanlagrar informationen i en temporärtabell, vilket säger sig självt att det är en mycket krävande process. Att som Andreas föreslog där man hämtar info från en annan tabell för varje rad, hur mycket skiljer sig det från den förra, prestanda sett?