webForumDet fria alternativet

Person som jobbar i flera enheter; lista samma rad?

Databaser & SQL

8 svar · 287 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

Hejsan, undrar om nån vet hur hur ändrar man från detta:

F_namn E_namn Enhet
Lisa Nilsson Enh1 -- personal_id: 89
Lisa Nilsson Enh2 -- personal_id: 89
Kalle Sten Enh1
Sara Renholm Enh3
Lisa Nilsson Enh4 -- personal_id: 292

till

F_namn E_namn Enhet
Lisa Nilsson Enh1/Enh2 -- personal_id: 89
Kalle Sten Enh1
Sara Renholm Enh3
Lisa Nilsson Enh4 -- personal_id: 292

Det är tre tabeller som ligger till grund;

1. Enheter
2. Personal
3. Plats (kopplingsbox eftersom det är många-många).

Enheter:
Enhets_id, Enhet (etc)

Personal:
Id, f_namn, E_namn, telefon

Plats:
Personal_id, Enhets_Id

Min SQL för att lista fram personal och enheter ser ut så här:

SET @sqlStmt = "SELECT DISTINCT per.e_namn, per.f_namn,
enh.enhet, per.telefon FROM plats pla INNER JOIN 
personal per ON pla.personal_id = per.Id INNER JOIN Enheter 
enh ON pla.enhets_id = enh.enhets_id WHERE per.e_namn LIKE '" + @letter +
"%' ORDER BY " + @sortCriteria + " " + @sortOrder

Jag har suttit ganska lång tid o inte kommit på nån vettig SQL för att lösa detta.. tyckte det var mycket svårt.. om det går att lösa med SQL istället för med applikationskod skulle det vara suveränt.. :) om det inte går att lösa får det vara helt enkelt..

Medlem sedan dec. 200012 464 inlägg
#2

Beror på DBMS, då vissa har en fördefinierad funktion för detta. Annars får man skriva en egen funktion.

Medlem sedan juni 2000504 inlägg
#3

Hej LarsG :) (MS) jag kör med SQL server.. kan det finnas inbyggd funktion för just det här??? oj..

vore kul att se hur en egen funktion ser ut också...? : )

* väntar med spänning * hehe

Medlem sedan dec. 200012 464 inlägg
#4
create function nefertite(@personal_id int)
returns varchar(200)
as
begin
    declare @enheter varchar(200)
    select @enheter = coalesce(@enheter + '/','') + enhet
      from enheter
     where enhets_id in (
         select enhets_id 
           from plats
          where personal_id = @personal_id)
    return @enheter
end

anropas med

select Id, f_namn, E_namn,dbo..nefertite(id)
from personal

ungefär

Medlem sedan juni 2000504 inlägg
#5

Hej LarsG ! oj.. ser jättefint ut.. nefertite skapades utan problem..

nu skäms jag för att jag inte fick det att fungera, men när jag körde

select Id, f_namn, E_namn,dbo..nefertite(id)
from personal

Server: Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '('.

..?

Medlem sedan dec. 200012 464 inlägg
#6
dbo.nefertite(id)

skall det vara

Medlem sedan juni 2000504 inlägg
#7

ooooooooo ! Jag är grymt imponerad !!!! :))) hade inte kommit på det där om jag suttit hela natten.. eller veckan för den delen.. ! att det är så lite kod.. när jag spånade blev det kaos..

hehe.. varför "nefertite"...? sökte på google.. fick att det var portugisiska.. eller namnet på faraos fru.. eller nåt band.. nåja, stort tack..!!! ska titta på koden en gång till o försöka greppa den... :)

Medlem sedan juni 2000504 inlägg
#8

Hej igen.. satt o höll på med SQL satsen från igår.. :) jag kom på att det inte gick att använda AS

dbo.nefertite(id) AS enhet_nef

o sen från applikationen selecta enhet_nef som en kolumn, och funderade ifall det kanske måste finnas en kolumn som heter så och inte bara ett alias?

Så jag provade att skapa en temporär tabell som då kunde returnera rätt värden till applikationen men får inte till syntaxen (om det finns enklare sätt så provar jag gärna det såklart :)

CREATE PROCEDURE dbo.coke_getAllStaffNoEmail
	@sortCriteria varchar(20),
	@sortOrder varchar(5)
AS

CREATE TABLE @#tableTemp
(
	tmpId	int	IDENTITY(1,1),
	e_namn varchar(30),
	f_namn varchar(30),
	enhet_nef varchar(100),
	telefon varchar(30)	
)

DECLARE @sqlStmt varchar(455) 

-- Här vill jag inserta värden till #tableTemp så att jag 
-- kan selecta från den sen med @sqlStmt2
SET @sqlStmt = "INSERT INTO #tableTemp
SELECT DISTINCT per.e_namn, per.f_namn,
dbo.nefertite(id) AS enhet_nef, per.telefon FROM plats pla INNER JOIN 
personal per ON pla.personal_id = per.Id INNER JOIN Enheter 
enh ON pla.enhets_id = enh.enhets_id
ORDER BY " + @sortCriteria + " " + @sortOrder

DECLARE @sqlStmt2 varchar(255) 

SET @sqlStmt2 = "SELECT DISTINCT per.e_namn, per.f_namn,
enhet_nef, per.telefon FROM #tableTemp ORDER BY " + @sortCriteria + " " + @sortOrder

EXEC sp_executesql @sqlStmt2
GO

Sen får jag också fel att maximum längden är 128. Det är ett fel jag inte begriper mig på heller !! ibland går det att lösa genom att sätta hela SQL strängen i en variabel och testa med enkel-/dubell fnuttar.. ibland blir det fel vilket som..?? :)

Medlem sedan juni 2000504 inlägg
#9

ursäkta så mycket.. det funkade visst såsom det var tänkt från början.. jag som klantade mig imorse ! satt o höll på med lite annat o testade av en slump en gång till och så fungerade det plötsligt med

dbo.nefertite(id) AS enhet

jag är supernöjd.. tack för hjälpen igen !! :)

277 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)