04 Ocak 2009

Normalize Tablodaki Değerleri Birleştirmek

Normalize tasarlanmış bir database'de çoklu seçim alanlarını tek bir alan olarak birleştirilmiş şekilde gösterme ihtiyacı olabilir. Örneğin kullanıcı tablosu var, kullanıcı için o alanın değer tanımlarının olduğu (propertyid,propertyName) şeklinde bir itmProperty tablosu var ve bir kullanıcı için n satır olmak üzere kullanıcıya ait property değerlerinin tutulduğu (userid,propertyid) şeklinde bir userProperty tablosu var. Bizim istediğimiz ise kullanıcıları listelediğimiz sorguda kullanıcıya ait property değerlerinin isimlerini virgülle ayrılmış şekilde tek bir alanda getirmek. Önce aşağıdaki kullanıcı tanımlı fonksiyonu oluşturmak gerekiyor.

CREATE FUNCTION [dbo].[fnGetPropertyList] (@userid bigint)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @propertyList VARCHAR(8000)
SET @propertyList = ''
DECLARE @rslt VARCHAR(8000)
SET @rslt=NULL
SELECT @propertyList = @propertyList + propertyName + ','
FROM itmProperty
WHERE propertyid in
(select propertyid from userProperty where userid=@userid)
ORDER BY propertyName

IF LEN(@propertyList)>0
SET @rslt= LEFT(@propertyList,(LEN(@propertyList) -1))
ELSE
SET @rslt= NULL

RETURN @rslt
END

Bu fonksiyonu sorgu içerisinde aşağıdaki şekilde kullanabiliriz.

Select *,
fnGetPropertyList(U.userid)
from tblUser U

0 yorum: