سؤال
وأواجه لادخال القيم في عمود جديد في قاعدة البيانات الخاصة بنا ولكن لا يمكنني الحصول على رأسي حول القيام بذلك بطريقة متسقة. هناك الكثير من البيانات القيام بذلك يدويا أي شيء هو الى حد كبير غير وارد. اسمحوا لي أن تمهد الطريق:
لدينا جدول يسمى التواجد وجدول يسمى OccurenceBuckets حيث كل تواجد هو إشارة دلو التي تم تعيين ذلك. سابقا كان هذا في اتجاه واحد إشارة لكن لأسباب مختلفة فقد قررنا إضافة مرجع مرة أخرى من OccurrenceBucket إلى حدوث الأول (الأول في الوقت المناسب، وهذا هو). الجداول تبدو الآن مثل هذا:
CREATE TABLE Occurrence
OccurrenceID uniqueidentifier,
OccurrenceBucketID uniqueidentifier,
OccurrenceTime datetime,
OccurrenceMessage nvarchar
...other meta data...
CREATE TABLE OccurrenceBucket
OccurrenceBucketID uniqueidentifier,
...other meta data...
FirstOccurrenceID uniqueidentifier,
FirstOccurrenceTime datetime,
FirstOccurrenceMessage nvarchar
وأنا أبحث عن وسيلة لتحديد التواجد الأول ينتمون إلى دلو وتعيين FirstOccurrenceID، FirstOccurrenceTime وFirstOccurrenceMessage مع القيم من هذا التواجد الأول لجميع بلدي occurrencebuckets.
هل أي واحد منكم خبراء SQL-فو هناك لديهم الوقت لمساعدتي، كل محاولاتي ينظر لإنتاج مجموعة غير صحيحة أو غير كاملة من الأحداث.
المحلول
ويمكنك أن تجرب هذا
DECLARE @Occurrence TABLE(
OccurrenceID INT,
OccurrenceBucketID INT,
OccurrenceTime DATETIME,
OccurrenceMessage VARCHAR(MAX)
)
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 1, 1, '01 Jan 2009', 'A'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 2, 1, '02 Jan 2009', 'B'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 3, 1, '03 Jan 2009', 'C'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 4, 2, '04 Jan 2009', 'D'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 5, 2, '05 Jan 2009', 'E'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 6, 2, '06 Jan 2009', 'F'
SELECT * FROM @Occurrence
DECLARE @OccurrenceBucket TABLE(
OccurrenceBucketID INT,
FirstOccurrenceID INT,
FirstOccurrenceTime DATETIME,
FirstOccurrenceMessage VARCHAR(MAX)
)
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 1
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 2
SELECT * FROM @OccurrenceBucket
UPDATE @OccurrenceBucket
SET FirstOccurrenceID = OccurrenceID,
FirstOccurrenceTime = OccurrenceTime,
FirstOccurrenceMessage = OccurrenceMessage
FROM @OccurrenceBucket oc INNER JOIN
(
SELECT o.*
FROM @Occurrence o INNER JOIN
(
SELECT OccurrenceBucketID,
MIN(OccurrenceID) FirstOccurrenceID
FROM @Occurrence
GROUP BY OccurrenceBucketID
) Mins ON o.OccurrenceID = mins.FirstOccurrenceID
) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID
SELECT * FROM @OccurrenceBucket
وتحرير:
UPDATE @OccurrenceBucket
SET FirstOccurrenceID = OccurrenceID,
FirstOccurrenceTime = OccurrenceTime,
FirstOccurrenceMessage = OccurrenceMessage
FROM @OccurrenceBucket oc INNER JOIN
(
SELECT o.*
FROM @Occurrence o INNER JOIN
(
SELECT OccurrenceBucketID,
MIN(OccurrenceTime) FirstOccurrenceTime
FROM @Occurrence
GROUP BY OccurrenceBucketID
) Mins ON o.OccurrenceTime = mins.FirstOccurrenceTime
) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID
نصائح أخرى
حسنا، للعثور على التواجد الأول في دلو لا ينبغي أن العمل التالية؟
SELECT TOP 1
OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
OccurranceBucketID = @OccurranceBucketID
ORDER BY
OccurranceTime ASC
ويمكنك تعيين الحقول عاد إلى المتغيرات ومن ثم تحديث OccurranceBucket وفقا لذلك.
<سوب> NB: "حدوث" لا يوجد لديه "أ" في ذلك سوب>
وهذه الإجابة تعتمد على OccurrenceTime يجري فريدة من نوعها لكل الحدوث: -
ضبط وتحديث OccBuck
OccBuck.FirstOccurrenceID = Occ.OccurrenceID،
OccBuck.FirstOccurrenceTime = Occ.OccurrenceTime،
OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage
من
dbo.OccurrenceBucket كما OccBuck
صلة داخلية dbo.Occurrence كما بالخام على OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
صلة داخلية (اختر OccurrenceBucketID،
MIN (OccurrenceTime) باسم 'MinOccurrenceTime "
من dbo.Occurrence
مجموعة من OccurrenceBucketID) كما minOcc على Occ.OccurrenceBucketID = minOcc.OccurrenceBucketID و
Occ.OccurrenceTime = minOcc.MinOccurrenceTime