PDA

View Full Version : سوال: یک JOIN غیر معمول



ali_abbasi22145
سه شنبه 18 اسفند 1388, 23:28 عصر
سلام
من يك جدول اصليmain دارم كه شامل كليد pk با مقدار 100، fname علي ،lname حسيني ، father احمد مي باشد.
جدول افراد تحت تكفل secondary كه شامل كليد pk_sec با مقدار 100، relation همسر ، fname_sec زهرا ،lname_sec شيرازي ، مي باشد
باز كليد pk_sec با مقدار 100، relation فرزند ، fname_sec سيروس ،lname_sec حسيني مي باشد.

همنيطور كليد pk با مقدار 101، fname بيژن ،lname تهراني ، father شيرزاد مي باشد.
جدول secondary كه شامل كليد pk_sec با مقدار 101، relation همسر ، fname_sec سارا ،lname_sec شمسي ، مي باشد
بعضي افراد ممكن است هيچ افراد تحت تكفل نداشته باشند و بعضي افراد افراد تحت تكفل 2 يا 3 يا ... حداكثر 7 تا هستند.
حال Join مي خواهم كه تمام فيلدهاي جدول main و جدول secondary در يك ركورد (سطر) باشند.
مثل: 100،علي،حسيني،احمد،همسر،زه ا،شيرازي،فرزند،سيروس،حسي ي.

محمد سلیم آبادی
چهارشنبه 19 اسفند 1388, 14:20 عصر
سلام،
برای حد اکثر دو نفر تحت تکفل می تونین از این کوئری استفاده کنید من ابتدا داده های آزمایشی را تهیه و تدارک می بینم بعد کوئری رو روی آونها اجرا سپس نتیجه را به نمایش در میاورم:
کد زیر را می تونید روی سیستم خود اجرا کنید (SQL Server 2005 و بالاتر) از جداول موقتی تهیه شدند.


SET NOCOUNT ON;
DECLARE @MAIN TABLE
(pk TINYINT NOT NULL PRIMARY KEY,
fname NVARCHAR(20) NOT NULL,
lname NVARCHAR(20) NOT NULL,
father NVARCHAR(20) NULL);

DECLARE @SECONDERY TABLE
(pk_sec TINYINT NOT NULL,
--REFERENCES MAIN(pk)
relation NVARCHAR(20) NOT NULL,
fname_sec NVARCHAR(20) NOT NULL,
lname_sec NVARCHAR(20) NOT NULL);

INSERT INTO @MAIN VALUES (100, N'علی', N'حسینی', N'احمد');
INSERT INTO @MAIN VALUES (101, N'بیژن', N'تهرانی', N'شیرزاد');
INSERT INTO @MAIN VALUES (102, N'محمد', N'سلیم آبادی', NULL);

INSERT INTO @SECONDERY
SELECT pk_sec = 100,
relation = N'همسر',
fname_sec = N'زهرا',
lname_sec = N'شیرازی'
UNION ALL SELECT 100, N'فرزند', N'سیروس', N'حسینی'
UNION ALL SELECT 101, N'همسر', N'سارا', N'شمسی';

SELECT *
FROM
(
SELECT S1_fname_sec=S1.fname_sec,
S1_lname_sec=S1.lname_sec,
S1_relation= S1.relation,
S2_fname_sec=S2.fname_sec,
S2_lname_sec=S2.lname_sec,
S2_relation=S2.relation,M.pk,
fname,
lname,
father,
Row_NO = ROW_NUMBER() OVER(PARTITION BY M.pk ORDER BY (SELECT 0))
FROM @SECONDERY S1
RIGHT JOIN @SECONDERY S2
ON S1.pk_sec = S2.pk_sec AND S1.fname_sec <> S2.fname_sec
RIGHT JOIN @MAIN M
ON S2.pk_sec = M.pk)D
WHERE Row_NO = 1


http://www.barnamenevis.org/forum/attachment.php?attachmentid=45395&stc=1&d=1268219974

ali_abbasi22145
جمعه 20 فروردین 1389, 15:34 عصر
من یکجور دیگر حل کردم که شاید جواب این سوال نباشد:



SELECT CardDB2.dbo.Ext_View.first_name, CardDB2.dbo.Ext_View.last_name, CardDB2.dbo.Ext_View.employee_number

,CardDB.dbo.CardTable.sicard,CardDB.dbo.CardTable. tag,CardDB.dbo.CardTable.photo_tag, CardDB.dbo. CardTable.log_of_card_print,
CardDB.dbo.CardTable.creation_date,CardDB.dbo.Card Table.creation_date_sh,CardDB.dbo.CardTable.last_m odified,CardDB.dbo.CardTable.last_modified_sh,
CardDB.dbo.CardTable.photo_last_modified, CardDB.dbo.CardTable.photo_last_modified_sh,CardDB .dbo.CardTable.print_date,CardDB.dbo.CardTable.pri nt_date_sh,
CardDB.dbo.CardTable.number_of_print, CardDB.dbo.CardTable.number_of_modified, CardDB.dbo.CardTable.number_of_photo_modified,
CardDB.dbo.CardTable.print_status, CardDB.dbo.CardTable.card_format, CardDB.dbo.CardTable.picture_file_name

FROM CardDB2.dbo.Ext_View
LEFT JOIN CardDB.dbo.CardTable ON CardDB2.dbo.Ext_View.employee_number = CardDB.dbo.CardTable.employee_number