View Full Version : سوال: یک JOIN غیر معمول
  
ali_abbasi22145
چهارشنبه 19 اسفند 1388, 00: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, 15: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, 16: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
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.