|
| Insert ... Select ??? Fra : stk | Vist : 1062 gange 350 point Dato : 15-06-01 12:10 |
|
Jeg vil gerne insætte data fra to tabeller (T1 og T2) i en enkelt tabel(T3) via en Stored Procedure:
INSERT INTO T3(UserID, UserName, Email)
SELECT UserID FROM T1 WHERE GUID=xxx
SELECT FeltVærdi FROM T2 WHERE GUID=xxx AND FeltNavn=UserName
SELECT FeltVærdi FROM T2 WHERE GUID=xxx AND FeltNavn=Email
T1:
GUID UserID
xxx BGATES
T2:
GUID FeltNavn FeltVærdi
xxx UserName Bill Gates
xxx Email b.gates@whatever
T3:
UserID UserName Email
BGATES Bill Gates b.gates@whatever
Jeg kan ikke helt gennemskue syntaxen for sådan en insert ... select ting.
Nogle ideer?
| |
| Accepteret svar Fra : pawel | Modtaget 360 point Dato : 15-06-01 12:19 |
|
INSERT INTO T3(UserID, UserName, Email)
SELECT UserID, t2.FeltVærdi, t2a.FeltVærdi
FROM T1, t2, t2 t2a WHERE t1.GUID=xxx
and t2.GUID=xxx AND t2.FeltNavn=UserName
and t2a.GUID=xxx AND t2a.FeltNavn=Email
/pawel
| |
| Godkendelse af svar Fra : stk |
Dato : 15-06-01 12:39 |
|
Så nemt var det jo
Jeg tror, du har prøvet det før?
stefan
| |
| Kommentar Fra : stk |
Dato : 15-06-01 13:49 |
|
Hvad nu hvis email feltet ikke altid findes?
| |
|
"stk" <stk.news@kandu.dk> wrote in message
news:_8lW6.1548$hi6.175851@news000.worldonline.dk...
> Jeg vil gerne insætte data fra to tabeller (T1 og T2) i en enkelt
> tabel(T3) via en Stored Procedure:
>
> Jeg kan ikke helt gennemskue syntaxen for sådan en insert ... select
> ting.
> Nogle ideer?
BOL (Books Online) giver dig det (for det meste) du skal bruge
Jeg går udfra at det er MSSQL? - siden du nævner stored procedures
Du kan evt erklære nogle variabler
------------------------------------
Declare @UserID VarChar(50),
@UserName VarChar(50),
@Email VarChar(50)
Set NoCount On
Select @UserID = UserID From T1 Where GUID=xxx
Select @UserName = FeltVærdi From T2 Where GUID=xxx AND FeltNavn=UserName
Select @Email = FeltVærdi From T2 Where GUID=xxx And FeltNavn=Email
Insert Into T3 (UserID, UserName, Email)
Values (@UserID, @UserName, @EMail)
Set NoCount Off
------------------------------------
mvh/Peter Lykkegaard
| |
| Kommentar Fra : pawel |
Dato : 15-06-01 15:06 |
|
Hvis en af felterne kan risikere ikke at være til stede,
skal du lave en så kaldt "outer join", jeg er ikke sikker på
syntaxen, men det er noget i retning af :
INSERT INTO T3(UserID, UserName, Email)
SELECT UserID
,t2.FeltVærdi
,t2a.FeltVærdi
FROM T1
left outer join t2 on t1.guid = t2.guid
left outer join t2 t2a on t1.GUID=t2a.guid
where t1.GUID=xxx AND t2.FeltNavn=UserName
and t2a.FeltNavn=Email
Det, som jeg er usikker på er, om t2a skal står lige efter t2, eller om
det skal stå i slutning af den linie.
/pawel
| |
|
On Fri, 15 Jun 2001 10:09:44 GMT, "stk" <stk.news@kandu.dk> wrote:
>T1:
>GUID UserID
>xxx BGATES
>
>T2:
>GUID FeltNavn FeltVærdi
>xxx UserName Bill Gates
>xxx Email b.gates@whatever
>
>T3:
>UserID UserName Email
>BGATES Bill Gates b.gates@whatever
>
INSERT T3
SELECT T1.UserID, T2_1.Feltværdi AS 'UserName', T2_2.Feltværdi AS
'email'
FROM T1 INNER JOIN T2 AS T2_1
ON T1.GUID = T2_1.GUID
AND T2_1.Feltnavn = 'Username'
INNER JOIN T2 AS T2_2
ON T1.GUID = T2_2.GUID
AND T2_2.Feltnavn = 'email'
WHERE T1.GUID = 'xxx'
--
Bo Larsson
| |
| Kommentar Fra : stk |
Dato : 19-06-01 10:14 |
|
Peter Lykkegaard foreslår at bruge variable, pawel foreslår Outer Join.
Hvor opnår man performance?
stefan
| |
| Kommentar Fra : pawel |
Dato : 19-06-01 11:15 |
|
Hvis du sidder med MS SQL, kan du slår analyseren til og se hvordan explainplan for begge
løsninger er. Det tager kun et øjeblik.
Jeg tvivler at der er den store forskel, men forventer selvfølgelig at min metode er mest optimal.
Det er nok mest spørgsmål om stilen.
Jeg vil altid forsøge at løse så meget som muligt med et "rent" SQL,
i stedet for at "programmere" mig ud af opgaver.
Fordelen er, som jeg ser det, at koden er mere flytbar.
I øvrigt er der en anden forskel på vores løsninger: hvis ikke din GUID er unik i T1 tabellen , hvad jeg selvfølgelig tror den er, vil min metode indsætte alle rækker med pågældende GUID.
Peter Lykkegaard's løsning vil kun indsætte én (vist nok den første).
Og flytter du Peter's kode, med de nødvendige tilpasninger, til Oracle DB vil du får en runtime fej, hvis der findes flere rækker.
/pawel
| |
| Kommentar Fra : stk |
Dato : 19-06-01 11:24 |
|
Jeg kigger lidt på analyzer'en.
Tak for dit svar.
Stefan
| |
| Du har følgende muligheder | |
|
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.
Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
| |
|
|