كيفية القيام بـ INSERT في سجلات الجدول المستخرجة من جدول آخر

StackOverflow https://stackoverflow.com/questions/74162

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول كتابة استعلام يستخرج البيانات ويحولها من جدول ثم يقوم بإدراج تلك البيانات في جدول آخر.نعم، هذا استعلام لتخزين البيانات وأنا أفعل ذلك في MS Access.لذلك أريد في الأساس بعض الاستعلامات مثل هذا:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

لقد حاولت ولكن حصلت على رسالة خطأ في بناء الجملة.

ماذا ستفعل إذا كنت تريد أن تفعل هذا؟

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

المحلول

لا توجد "قيم"، بدون أقواس:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;

نصائح أخرى

لديك خياران لبناء الجملة:

الخيار 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

الخيار 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

ضع في اعتبارك أن الخيار 2 سينشئ جدولًا يحتوي فقط على الأعمدة الموجودة في الإسقاط (تلك الموجودة في SELECT).

قم بإزالة كل من VALUES والأقواس.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1

يزيل VALUES من SQL الخاص بك.

أعتقد أن مشكلتك في هذه الحالة هي الكلمة الأساسية "القيم".يمكنك استخدام الكلمة الأساسية "القيم" عندما تقوم بإدراج صف واحد فقط من البيانات.لإدراج نتائج التحديد، لا تحتاج إليها.

كما أنك لا تحتاج حقًا إلى الأقواس حول عبارة التحديد.

من msdn:

استعلام إلحاقي متعدد السجلات:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

استعلام إلحاقي لسجل واحد:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

قم بإزالة "القيم" عند إلحاق مجموعة من الصفوف، وقم بإزالة الأقواس الإضافية.يمكنك تجنب المرجع الدائري باستخدام اسم مستعار لـ avg(CurrencyColumn) (كما فعلت في المثال الخاص بك) أو بعدم استخدام اسم مستعار على الإطلاق.

إذا كانت أسماء الأعمدة هي نفسها في كلا الجدولين، فسيكون الاستعلام الخاص بك كما يلي:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

وسيعمل بدون اسم مستعار:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;

حسنًا، أعتقد أن أفضل طريقة ستكون (ستكون؟) تحديد مجموعتين من السجلات واستخدامهما كوسيط بين الجدولين.

  1. افتح مجموعتي السجلات
  2. استخراج البيانات من الجدول الأول (SELECT blablabla)
  3. قم بتحديث مجموعة السجلات الثانية بالبيانات المتوفرة في مجموعة السجلات الأولى (إما عن طريق إضافة سجلات جديدة أو تحديث السجلات الموجودة
  4. قم بإغلاق مجموعتي السجلات

تعتبر هذه الطريقة مثيرة للاهتمام بشكل خاص إذا كنت تخطط لتحديث الجداول من قواعد بيانات مختلفة (أي يمكن أن يكون لكل مجموعة سجلات اتصال خاص بها ...)

إدراج بيانات من جدول واحد إلى جدول آخر في قاعدة بيانات مختلفة

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup

هل تريد إدراج الاستخراج في جدول موجود؟

إذا لم يكن الأمر مهمًا، فيمكنك تجربة الاستعلام أدناه:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

سيتم إنشاء جدول جديد -> T1 بالمعلومات المستخرجة

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