سؤال

في خادم SQL 2008:

لنفترض أن لدي جدولين.

يحتوي الجدول 1 على 3 حقول:الاسم والتاريخ 1 والتاريخ 2.حاليًا، كافة إدخالات Date2 فارغة.(الاسم، التاريخ1) يشكل مفتاحًا فريدًا.

يحتوي الجدول 2 على حقلين:الاسم والتاريخ2.(الاسم، التاريخ2) يشكلان مفتاحًا فريدًا.

يحتوي كل "اسم" في الجدول 1 على إدخال واحد مطابق على الأقل في الجدول 2.

الآن، أريد تحديث كافة إدخالات Date2 في الجدول 1 (تذكر أنها كلها فارغة الآن) إلى إدخال Date2 في الجدول 2 الذي يمثل الأقرب حتى تاريخ 1 في الجدول 1.أي.التاريخ الذي سيعطي نتيجة:

 min(datediff(dd,Table1.Date1,Table2.Date2))

لكي أكون واضحًا، إذا كان لدي الإدخالات التالية:

الجدول 1:

[اسم]:كارل، [التاريخ 1]:1/1/2009، [التاريخ الثاني]:باطل

الجدول 2:

[اسم]:كارل، [التاريخ 2]:1/1/2000

[اسم]:كارل، [التاريخ 2]:1/7/2009

[اسم]:كارل، [التاريخ 2]:1/1/2010

ثم أريد تحديث Table1.Date2 إلى "1/7/2009" نظرًا لأن هذا هو أقرب تاريخ إلى "1/1/2009".

شكرًا جزيلاً

كارل

هل كانت مفيدة؟

المحلول

WITH abcd AS
 (
 SELECT t1.Name,t1.Date1, t2.Date2
  ,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
 FROM 
  Table1 AS t1 
  JOIN Table2 AS t2 ON t1.Name = t2.Name
 )
UPDATE Table1 SET
    [Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)

نصائح أخرى

UPDATE  Table1
SET     Date2 = t2.Date2
FROM    Table1 t1
JOIN    Table2 t2
    ON  t1.Name = t2.Name
    AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT  MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
                                                FROM    Table1 t1
                                                JOIN    Table2 t2
                                                    ON  t1.Name = t2.Name
                                                )

تحقق مما إذا كنت بحاجة ABS - أعتقد أنك تفعل.

كما أن الاستعلام لا يتعامل مع الحالة التي يوجد فيها تاريخان في الجدول 2 لهما نفس المسافة إلى التاريخ 1، ولكن من جوانب مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top