سؤال

أنا أحاول أن INSERT INTO جدول باستخدام مدخلات من جدول آخر.على الرغم من أن هذا ممكن تماما في كثير من قاعدة بيانات محركات يبدو لي دائما أن النضال من أجل تذكر الجملة الصحيح عن SQL المحرك من اليوم (الخلية, أوراكل, SQL Server, ينفورميكس, ، DB2).

هل هناك الفضة من الرصاص جملة من SQL القياسية (على سبيل المثال ، SQL-92) التي من شأنها أن تسمح لي أن أدخل القيم دون الحاجة إلى القلق حول الكامنة قاعدة البيانات ؟

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

المحلول

محاولة:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

هذا هو معيار ANSI SQL و يجب أن تعمل على أي DBMS

بالتأكيد يعمل من أجل:

  • أوراكل
  • MS SQL Server
  • الخلية
  • بوستجرس
  • سكليتي v3
  • مقاومه
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS الانزياح نحو الأحمر
  • SAP HANA

نصائح أخرى

@Shadow_x99:التي يجب أن تعمل بشكل جيد, و هل يمكن أن يكون أيضا أعمدة متعددة وغيرها من البيانات:

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

تحرير:أود أن أذكر أن كنت تستخدم فقط هذه الجملة مع Access, SQL 2000/2005/Express, MySQL و PostgreSQL ، حتى تلك التي ينبغي تغطيتها.المعلق قد أشار إلى أنه سوف يعمل مع SQLite3.

للحصول على قيمة واحدة فقط في موضوع القيمة INSERT من جدول آخر فعلت التالية في SQLite3:

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

كل الإجابات أرى تعمل بشكل جيد في ينفورميكس على وجه التحديد ، و هي في الأساس SQL القياسية.هذا هو التدوين:

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

يعمل بشكل جيد مع ينفورميكس و أتوقع كل DBMS.(مرة واحدة عند 5 سنوات أو أكثر, هذا هو نوع من الشيء الذي الخلية لم يكن دائما الدعم ؛ لديها الآن لائق دعم هذا النوع من المعايير بناء جملة SQL ، AFAIK هو موافق على هذا التعليق.) العمود قائمة اختيارية ولكن يشير إلى الهدف الأعمدة في تسلسل ، لذلك العمود الأول من نتيجة حدد سوف تذهب إلى سرد أولا العمود ، الخ.في غياب العمود قائمة العمود الأول من نتيجة حدد يذهب إلى العمود الأول من الجدول الهدف.

ماذا يمكن أن تكون مختلفة بين أنظمة الترقيم المستخدمة لتحديد الجداول في قواعد البيانات المختلفة - المعيار لديه شيء ليقوله عن بين قاعدة البيانات (ناهيك بين DBMS) العمليات.مع ينفورميكس ، يمكنك استخدام التدوين التالية لتحديد جدول:

[dbase[@server]:][owner.]table

فقد حدد قاعدة البيانات اختياريا تحديد الملقم الذي يستضيف قاعدة البيانات إذا لم يكن في الخادم الحالي ، تليها اختياري مالك, نقطة, وأخيرا الفعلي اسم الجدول.SQL القياسية يستخدم مصطلح مخطط ما ينفورميكس المكالمات المالك.وهكذا ، في ينفورميكس ، أي من الرموز التالية يمكن تحديد الجدول:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

مالك في العامة لا تحتاج إلى أن تكون نقلت;ومع ذلك, إذا كنت لا تستخدم اقتباسات, كنت بحاجة للحصول على اسم المالك مكتوبة بشكل صحيح - يصبح حساسا لحالة الأحرف.وهذا هو:

someone.table
"someone".table
SOMEONE.table

كل التعرف على طاولة واحدة.مع ينفورميكس هناك مضاعفات خفيفة مع وضع ANSI قواعد البيانات ، حيث صاحب الأسماء عموما تحويلها إلى upper-case (ينفورميكس هو الاستثناء).التي هي في وضع ANSI قاعدة البيانات (لا تستخدم عادة) ، يمكن أن تكتب:

CREATE TABLE someone.table ( ... )

و اسم المالك في النظام التسويقي سيكون "شخص" وليس "شخص ما".إذا كنت أرفق اسم المالك في علامات اقتباس مزدوجة ، فإنه يتصرف مثل محدد معرف.مع SQL القياسية, معرفات محددة يمكن استخدامها في العديد من الأماكن.مع ينفورميكس ، يمكنك استخدامها فقط حول أسماء مالك-في سياقات أخرى ، ينفورميكس يعامل كل من نقلت واحدة مزدوجة-نقلا عن سلاسل سلاسل, بدلا من فصل واحد-نقلا عن سلاسل سلاسل مزدوجة-نقلا عن سلاسل معرفات محددة.(بالطبع, فقط للتأكد من اكتمالها ، هناك بيئة متغيرة ، DELIMIDENT, التي يمكن تعيينها إلى أي قيمة ، ولكن Y أسلم - تشير إلى أن التنصيص دائما تحيط معرفات محددة و علامات الاقتباس المفردة دائما تحيط السلاسل.)

علما بأن MS SQL Server تمكن من استخدام [معرفات محددة] بين قوسين معقوفين.يبدو غريبا بالنسبة لي و هي بالتأكيد ليست جزءا من SQL القياسية.

معظم قواعد البيانات اتبع الأساسية في بناء الجملة ،

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

كل قاعدة البيانات التي استخدمت في متابعة هذه الجملة وهي DB2, SQL Server, MY SQL, PostgresQL

أن تضيف شيئا في الجواب الأول ، عندما نريد فقط قليل من السجلات من جدول آخر (في هذا المثال واحد فقط):

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

هذا يمكن أن يتم دون تحديد الأعمدة في INSERT INTO الجزء إذا كنت توريد القيم لجميع الأعمدة في SELECT جزء.

دعونا نقول جدول1 اثنين من الأعمدة.هذا الاستعلام يجب أن تعمل:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

هذا ليس عمل (قيمة col2 لم يتم تحديد):

INSERT INTO table1
SELECT  col1
FROM    table2

أنا باستخدام MS SQL Server.أنا لا أعرف كيف آخر RDMS العمل.

بدلا من VALUES جزء من INSERT الاستعلام فقط استخدام SELECT الاستعلام كما يلي.

INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2

هذا هو مثال آخر على استخدام القيم مع تحديد:

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

بسيطة الإدراج عند عمود الجدول تسلسل المعروف:

    Insert into Table1
    values(1,2,...)

بسيطة الإدراج بالذكر العمود:

    Insert into Table1(col2,col4)
    values(1,2)

الأكبر الإدراج عند عدد من الأعمدة المحددة من الجدول(#table2) تساوي إدراج الجدول(Table1)

    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

الأكبر الإدراج عندما تريد إدراج سوى إلى المطلوب عمود من الجدول(table1):

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

هنا هو مثال آخر حيث مصدر مأخوذ استخدام أكثر من الجدول:

INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;

هنا هو كيفية إدراج من جداول متعددة.هذا المثال هو حيث يمكنك تعيين الجدول في العديد من العديد من السيناريو:

insert into StudentCourseMap (StudentId, CourseId) 
SELECT  Student.Id, Course.Id FROM Student, Course 
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'

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

INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

هذا يعمل على جميع DBMS

هل يمكن أن تحاول ذلك إذا كنت ترغب في إدراج كل عمود باستخدام SELECT * INTO الجدول.

SELECT  *
INTO    Table2
FROM    Table1;

هذا العمل بالنسبة لي:

insert into table1 select * from table2

الجملة هي مختلفة قليلا من أوراكل.

Microsoft SQL Server, أنا سوف يوصي التعلم تفسير الجملة المقدمة على MSDN.مع جوجل انها أسهل من أي وقت مضى للبحث عن الجملة.

عن هذه القضية بالذات ، في محاولة

جوجل:إدراج site:microsoft.com

النتيجة الأولى سوف تكون http://msdn.microsoft.com/en-us/library/ms174335.aspx

انتقل لأسفل إلى مثال ("باستخدام تحديد وتنفيذ خيارات لإدراج البيانات من الجداول الأخرى") إذا كنت تجد صعوبة في تفسير جملة معينة في الجزء العلوي من الصفحة.

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
{
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] 
        { <object> | rowset_function_limited 
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
        }
    {
        [ ( column_list ) ] 
        [ <OUTPUT Clause> ]
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ] 
        | derived_table       <<<<------- Look here ------------------------
        | execute_statement   <<<<------- Look here ------------------------
        | <dml_table_source>  <<<<------- Look here ------------------------
        | DEFAULT VALUES 
        }
    }
}
[;]

يجب أن يكون هذا ينطبق على أي RDBMS المتاحة هناك.لا يوجد أي نقطة في تذكر كل جملة لجميع منتجات المنظمة البحرية الدولية.

أنا في الواقع أفضل التالية في SQL Server 2008:

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

فإنه يلغي الخطوة إضافة إدراج () مجموعة و أنت فقط حدد القيم التي تذهب في الجدول.

مجرد استخدام أقواس على حدد شرط في إدراج.على سبيل المثال مثل هذا :

INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
   'col1_value', 
   'col2_value',
   (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
   'col3_value'
);
select *
into tmp
from orders

تبدو لطيفة ، ولكن يعمل فقط إذا tmp لا يوجد (يخلق ويملأ).(SQL sever)

لإدراج إلى القائمة tmp الجدول:

set identity_insert tmp on

insert tmp 
([OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry] )
      select * from orders

set identity_insert tmp off

أفضل طريقة إدراج سجلات متعددة من أي جداول أخرى.

INSERT  INTO dbo.Users
            ( UserID ,
              Full_Name ,
              Login_Name ,
              Password
            )
            SELECT  UserID ,
                    Full_Name ,
                    Login_Name ,
                    Password
            FROM    Users_Table
            (INNER JOIN / LEFT JOIN ...)
            (WHERE CONDITION...)
            (OTHER CLAUSE)
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

نهجين تضاف الى مع تحديد الاستعلامات.

  1. مع تحديد الاستعلام الفرعي العودة النتائج مع صف واحد.
  2. مع تحديد الاستعلام الفرعي العودة النتائج مع متعددة الصفوف.

1.النهج مع تحديد الاستعلام الفرعي العودة النتائج مع صف واحد.

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

في هذه الحالة, فإنه يفترض تحديد الفرعية الاستعلام إرجاع صف واحد فقط من النتيجة استنادا إلى حيث الشرط أو SQL وظائف الكلي مثل SUM, MAX, AVG الخ.وإلا فإنه سوف رمي خطأ

2.النهج مع تحديد الاستعلام الفرعي العودة النتائج مع متعددة الصفوف.

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

النهج الثاني العمل لكل الحالات.

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

INSERT INTO `receiving_table`
  (id,
  first_name,
  last_name)
VALUES 
  (1002,'Charles','Babbage'),
  (1003,'George', 'Boole'),
  (1001,'Donald','Chamberlin'),
  (1004,'Alan','Turing'),
  (1005,'My','Widenius');

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

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