Jag håller på och ska extrahera data från en SQL Server 2000 databas. Det är ett säljsystem. Klart det är möjligt i SQL 2005, använd den nya featuren WITH som kan ses som en temporär vy men med möjligheten att använda den rekursivt som nedan: <b>>den nya featuren WITH</b> Oops, jag såg inte att du körde SQL 2000, där kan du inte göra detta annat än via knöliga UDFer. WITH är inte implementerat i SQL 2000. Jojo, men det är ju inte en "ny feature". Det är ju bara en implementation av en del av den standarden som programmet "ska" uppfylla. Någon referens? Sant att WITH kom som CTE funktion i SQL99, jag hanterar ibland SQL92 och 99 lite vårdslöst. Vad jag syftade på var: Ordet with förekom i SQL 92 bland annat i Utan att spåra ur i ämnet helt så kan det konstateras att WITH som Common Table Expression i SQL server inte finns i sql 2000 och äldre utan endast i sql 2005 och att WITH som CTE först finns i sql99 standarden. Jag löste det precis genom att skapa en temptabell där jag hämtade ut alla butikerna + ett fält för kontaktpersoner. Sedan fyllde jag det fältet genom att använda en cursor och sedan använda temptabellen i orginalfrågan för att hämta kontaktpersonerna. Funkade perfekt efter lite pulande!Få resultat att hamna på samma rad
Det jag ska ha ut är alla butiker med tillhörande information, samt säljare och dess kontaktpersoner.
Detta resultat ska jag ha in i excel senare.
Det jag fastnat på är kontaktpersoner som hämtas via en mellantabell (butik - butikkontaktperson - kontaktperson).
Jag skulle vilja att via en subquery eller dylikt kunna hämta alla butikens kontaktpersoner och få dom att hamna på samma rad med kanske ett kommatecken som avskiljare. Är detta möjligt?Sv: Få resultat att hamna på samma rad
CREATE TABLE dbo.personal (
id INT NOT NULL,
avdelning INT NOT NULL,
namn VARCHAR(255) NOT NULL
)
GO
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (1, 1, 'stefan')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (2, 1, 'kalle')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (3, 1, 'henrik')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (4, 2, 'thomas')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (5, 2, 'agneta')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (6, 2, 'albin')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (7, 2, 'ingeborg')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (8, 3, 'håkan')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (9, 3, 'peter')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (10, 4, 'julle')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (11, 4, 'jesper')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (12, 4, 'johan')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (13, 4, 'anders')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (14, 4, 'per')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (15, 4, 'pelle')
INSERT INTO dbo.personal (id, avdelning, namn) VALUES (16, 5, 'christina')
GO
WITH rec (avdelning, counter, list, id, len)
AS (
SELECT avdelning,
COUNT(*) OVER (PARTITION BY avdelning),
CAST(namn AS VARCHAR(100)),
id,
1
FROM dbo.personal
UNION ALL
SELECT rec.avdelning,
rec.counter,
CAST(rec.list + ',' + p.namn AS VARCHAR(100)),
p.id,
rec.len + 1
FROM dbo.personal p, rec
WHERE p.avdelning = rec.avdelning
AND p.id > rec.id
)
SELECT avdelning,
list
FROM rec
WHERE len = counter
ORDER BY 1Sv:Få resultat att hamna på samma rad
Har inte WITH funnits sen SQL92-standarden kom?Sv: Få resultat att hamna på samma rad
Jojo, WITH har funnits i standarden men å andra sidan så finns det ingen DB som fullt ut stödjer allt i SQL92 för att inte säga ännu mindre SQL99Sv:Få resultat att hamna på samma rad
Sv:Få resultat att hamna på samma rad
Enligt http://msdn2.microsoft.com/en-US/library/aa238507(SQL.80).aspx så verkar det som att WITH åtminstone införds som nyckelord i SQL92.Sv: Få resultat att hamna på samma rad
Att WITH listas som reserverat ord för SQL server betyder bara att sql server har en speciell funktion för den. WITH har funnits med ett tag i sql server eftersom den används i SELECT FROM WITH (table hints), DBCC DBCC COMMAND() WITH ... osv.
WITH i SQL99 standarden har betydelsen som (i sql servers termer) CTE eller Common Table Expression eller en form av temporär vy (rekursiv eller inte)Sv:Få resultat att hamna på samma rad
<b>In addition, the SQL-92 standard defines a list of reserved keywords. Avoid using SQL-92 reserved keywords for object names and identifiers. The ODBC reserved keyword list (shown below) is the same as the SQL-92 reserved keyword list.
[...]
ODBC Reserved Keywords
[...]
WITH
</b>Sv: Få resultat att hamna på samma rad
datatyperna
time with timezone
timestamp with timezone
create view ...
with check option
grant ... with grant optionSv:Få resultat att hamna på samma rad
Samt att CTE i sql2005 förenklar många knöliga sql frågor som exempelvis sträng-join funktionen som efterfrågades initialtSv: Få resultat att hamna på samma rad