插入到值(选择从……)

watbbzwu  于 2021-07-24  发布在  Java
关注(0)|答案(26)|浏览(447)

我正在努力 INSERT INTO 使用另一个表的输入的表。尽管这对于许多数据库引擎是完全可行的,但我似乎总是很难记住 SQL 今天的引擎(mysql、oracle、sqlserver、informix和db2)。
是否有一个来自sql标准(例如sql-92)的银弹语法允许我插入值而不必担心底层数据库?

pcww981p

pcww981p1#

下面是如何从多个表中插入。在这个特定的示例中,在多对多场景中有一个Map表:

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'

(我意识到匹配学生姓名可能会返回多个值,但你明白了。当id是标识列且未知时,有必要对id以外的内容进行匹配。)

irlmq6kh

irlmq6kh2#

postgres支持下一步:创建表company.monitor2作为select*from company.monitor;

ssgvzors

ssgvzors3#

在informix中,正如claude所说:

INSERT INTO table (column1, column2) 
VALUES (value1, value2);
t2a7ltrp

t2a7ltrp4#

如果使用“插入值”路径插入多行,请确保使用括号将值分隔为多个集合,以便:

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');

否则mysql对象“列计数与第1行的值计数不匹配”,当您最终确定如何处理它时,您将编写一篇无关紧要的文章。

zkure5ic

zkure5ic5#

如果您想在表中插入一些数据而不想写入列名。

INSERT INTO CUSTOMER_INFO
   (SELECT CUSTOMER_NAME,
           MOBILE_NO,
           ADDRESS
      FROM OWNER_INFO cm)

表格所在位置:

CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR

结果:

CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR
      B       |     +55   |   RR        ||
gjmwrych

gjmwrych6#

select *
into tmp
from orders

看起来不错,但只有在tmp不存在时才有效(创建并填充它)(sql服务器)
要插入到现有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
vcirk6k6

vcirk6k67#

插入任何其他表中的多条记录的最佳方法。

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)
xyhw6mcr

xyhw6mcr8#

INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;
ijxebb2r

ijxebb2r9#

对于microsoftsqlserver,我建议您学习解释msdn上提供的语法。使用google,查找语法比以往任何时候都容易。
对于这种特殊情况,请尝试
谷歌:插入site:microsoft.com
第一个结果是http://msdn.microsoft.com/en-us/library/ms174335.aspx
如果您发现很难解释页面顶部给出的语法,请向下滚动到示例(“使用select和execute选项插入其他表中的数据”)。

[ 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。记住所有产品的所有语法是没有意义的。

jljoyd4f

jljoyd4f10#

这对我有用:

insert into table1 select * from table2

这个句子和甲骨文的有点不同。

j91ykkif

j91ykkif11#

实际上,我更喜欢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()集的步骤,只需选择表中的值。

yzxexxkh

yzxexxkh12#

如果要使用插入所有列,可以尝试此操作 SELECT * INTO table。

SELECT  *
INTO    Table2
FROM    Table1;
0yycz8jy

0yycz8jy13#

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

这适用于所有dbms

iyfjxgzm

iyfjxgzm14#

尝试:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

这是标准的ansisql,应该适用于任何dbms
它绝对适用于:
Oracle
ms sql服务器
mysql数据库
博士后
sqlite v3版
天睿资讯
db2公司
赛贝斯
眩晕
hsqldb公司
氢气
aws红移
sap hana公司
谷歌扳手

wbgh16ku

wbgh16ku15#

下面是另一个使用多个表获取源的示例:

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;

相关问题