/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Insert ... Select ???
Fra : stk
Vist : 1026 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?

Kommentar
Fra : Nyhedsbruger


Dato : 15-06-01 13:26


"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

Kommentar
Fra : Nyhedsbruger


Dato : 15-06-01 15:21

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.
Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste