PDA

Orijinalini görmek için tıklayınız : Veritabanında Tek Sutun Çoklu Id Girme


smhtopcu26
15-07-2017, 23:26:39
Merhaba Veritabanında Tablomdaki 1 Sutuna diğer tablodan çekilecek birden çok id girmek istiyorum bunu nasıl yapabilirim.

Örn: hastalik tablom var = hastalik_id , hastalik_adi olarak 2. tablom kullanıcı = kullanici_adi , kullanici_hastalik_id olarak seçilen birden falza hastalığı kullanıcıya atamak istiyorum bunu nasıl yapabilirim ?

KarcanOzbal
20-07-2017, 17:17:34
Merhaba Veritabanında Tablomdaki 1 Sutuna diğer tablodan çekilecek birden çok id girmek istiyorum bunu nasıl yapabilirim.

Örn: hastalik tablom var = hastalik_id , hastalik_adi olarak 2. tablom kullanıcı = kullanici_adi , kullanici_hastalik_id olarak seçilen birden falza hastalığı kullanıcıya atamak istiyorum bunu nasıl yapabilirim ?

Merhaba,
Söylediğin gibi int bir tek sahaya birden fazla id girebileceğini zannetmiyorum.
Satır tekrarı da istemiyorsun anladığım kadarıyla.

Yazdıklarınla kafamda şöyle bir şey canlandırdım sanal tablolarla oluşturdum.

kullanici_hastalik_id kısmını varchar yapıyorsun ve idleri virgüllü olarak elle veya programından yazdırabilirsin.

Daha sonra bu fonksiyon ile varchar'da virgül ile girdiğin idleri listeye dökebilirsin.


CREATE FUNCTION [dbo].[fn_SplitString](
@Metin NVARCHAR(MAX), -- Parçalanacak Metin
@Ayrac NVARCHAR(MAX)) -- Metni neye göre parçalasın ? Örnek : ',' veya '-'
RETURNS @AyrismisTablo TABLE (Ids int)
AS
BEGIN

DECLARE @Sayac INT
SET @Sayac = 1
DECLARE @Index INT

SET @Index = CHARINDEX(@Ayrac,@Metin)

WHILE (@Index>0)
BEGIN

INSERT INTO @AyrismisTablo
SELECT LTRIM(RTRIM(SUBSTRING(@Metin, 1, @Index - 1)))


SET @Metin = SUBSTRING(@Metin, @Index + DATALENGTH(@Ayrac) / 2, LEN(@Metin))
SET @Sayac = @Sayac + 1
SET @Index = CHARINDEX(@Ayrac, @Metin)

END

INSERT INTO @AyrismisTablo
SELECT LTRIM(RTRIM(@Metin))

RETURN

END


@hastaliklar tablosu
https://image.prntscr.com/image/sinwkG3TQwC6PwyAquESvg.png

@kullanicilar tablosu
https://image.prntscr.com/image/hVwqJBf0TzOdI4XTymx6_g.png

@kullanicilar + @hastaliklar verilerini içeren select sorgusu
https://image.prntscr.com/image/J1RisYZIRDapk1a75gc7uQ.png

@hastaliklar sanal tablosu

declare @hastaliklar table (hastalik_id int, hastalik_adi varchar(255))
insert into @hastaliklar select * from (values (1,'Astım'),(2,'Grip'),(3,'Alerji')) as X (A,B)
select * from @hastaliklar


@kullanicilar sanal tablosu

declare @kullanicilar table (kullanici_adi varchar(50), kullanici_hastalik_id varchar(255))
insert into @kullanicilar select * from (values ('Ahmet','1'),('Mehmet','2'),('Karcan','3,1')) as X (A,B)
select * from @kullanicilar


select sorgusu. (stuff ve as kullanici_hastaliklari arasında olan kısım tek sütunda birleştiren kısım.)

select kullanici.kullanici_adi, stuff((SELECT ',' + (hastalik_adi) from @hastaliklar
where hastalik_id in (select * from dbo.fn_SplitString((select kullanici_hastalik_id from @kullanicilar where kullanici_adi=kullanici.kullanici_adi),','))
FOR XML PATH ('') ) ,1,1,'') as kullanici_hastaliklari
from @kullanicilar as kullanici


edit1: en son kullandığım sorguda @ ile başlayan tablo isimlerini kendi tablo isimlerinle değiştirip güle güle kullanabilirsin :)

CeBoSoft
30-08-2017, 02:45:05
Bence öncelikle kullanıcılar tablosuna bir id kolonu açılması!!!!
http://images.cebosoft.com/sql/kullanicilar.PNG


http://images.cebosoft.com/sql/hastaliklar.PNG

Oluşturulan kullanıcı_id alanı ve hastalik_id alanını bir tabloya insert yaptırıp
http://images.cebosoft.com/sql/kullanici_hastalik_1.PNG

Aşağıdaki kısa sorgu ile çekmek daha kısa bir yol olacaktır.
http://images.cebosoft.com/sql/kullanici_hastalik_2.PNG

Sonrasında istenilen programlama dili ile arayüzde istediğiniz gibi gösterebilirsiniz.

smhtopcu26
30-08-2017, 02:51:11
Cevaplar için teşekkür ederim sorunu daha önce cebesoft sizin yaptığınız gibi yöntemle çözdük :)