Insert into ... القيم ( حدد ... من ... )
-
09-06-2019 - |
سؤال
أنا أحاول أن 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.النهج مع تحديد الاستعلام الفرعي العودة النتائج مع صف واحد.
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", و كنت في نهاية المطاف في كتابة تافهة آخر عندما كنت أخيرا معرفة ما يجب القيام به حيال ذلك.