【问题标题】:create new table with subquery select使用子查询选择创建新表
【发布时间】:2012-08-09 11:39:58
【问题描述】:

我正在尝试从子查询选择创建一个新表,但出现以下错误:
')' 附近的语法不正确。

SELECT * INTO foo 
FROM 
(
  SELECT DATEPART(MONTH,a.InvoiceDate) as CalMonth
        ,DATEPART(YEAR,a.InvoiceDate) as CalYear
        ,a.InvoiceDate
        ,a.StockCode
        ,a.QtyInvoiced
        ,a.Volume
  FROM sales a
  UNION ALL
  SELECT ds.CalMonth as CalMonth
        ,ds.CalYear as CalYear
        ,ds.InvoiceDate
        ,ds.StockCode
        ,ds.Cases as QtyInvoiced
        ,ds.Vol as Volume
  FROM sales1 ds
)

【问题讨论】:

  • 您正在使用哪个 RDBMS。究竟是什么错误?
  • 在大多数 DBMS 中,使用 CREATE TABLE foo AS select ... 创建一个新表可能需要使用该语法。

标签: sql subquery


【解决方案1】:

您忘记在查询末尾添加alias

您可以通过两种方法做到这一点:

1.如果您已经创建了一个表,那么您可以使用Insert Into 执行此操作,如下所示:

INSERT into foo (CalMonth,CalYear,InvoiceDate,StockCode,QtyInvoiced,Volume)
SELECT * FROM
(
SELECT 
    DATEPART(MONTH,a.InvoiceDate) as CalMonth
    ,DATEPART(YEAR,a.InvoiceDate) as CalYear
    ,a.InvoiceDate
    ,a.StockCode
    ,a.QtyInvoiced
    ,a.Volume
FROM sales a
UNION ALL
SELECT 
    ds.CalMonth as CalMonth
    ,ds.CalYear as CalYear
    ,ds.InvoiceDate
    ,ds.StockCode
    ,ds.Cases as QtyInvoiced
    ,ds.Vol as Volume
FROM sales1 ds
) AS table1

例如see this fiddle

2.如果您尚未创建表,则可以使用SELECT * INTO 执行此操作,如下所示:

SELECT * INTO foo from 
(
SELECT 
    DATEPART(MONTH,a.InvoiceDate) as CalMonth,
    DATEPART(YEAR,a.InvoiceDate) as CalYear,
    a.InvoiceDate,
    a.StockCode,
    a.QtyInvoiced,
    a.Volume
FROM sales a
UNION ALL
SELECT 
    ds.CalMonth as CalMonth,
    ds.CalYear as CalYear,
    ds.InvoiceDate,
    ds.StockCode,
    ds.Cases as QtyInvoiced,
    ds.Vol as Volume
FROM sales1 ds
) AS table1

例如see this fiddle

更多参考请见SQL SERVER – Insert Data From One Table to Another Table – INSERT INTO SELECT – SELECT INTO TABLE

【讨论】:

    【解决方案2】:

    试试这个

    select * into foo from 
    (
    select 
        DATEPART(MONTH,a.InvoiceDate) as CalMonth,
        DATEPART(YEAR,a.InvoiceDate) as CalYear,
        a.InvoiceDate,
        a.StockCode,
        a.QtyInvoiced,
        a.Volume
    from sales a
    Union All
    select 
        ds.CalMonth as CalMonth,
        ds.CalYear as CalYear,
        ds.InvoiceDate,
        ds.StockCode,
        ds.Cases as QtyInvoiced,
        ds.Vol as Volume
    from sales1 ds
    ) as TAB
    

    只需向您的子查询表提供alias

    【讨论】:

      【解决方案3】:

      试试这个:

          INSERT into foo (CalMonth,CalYear, InvoiceDate,  StockCode, QtyInvoiced, Volume)
      Select * From
          (select 
          DATEPART(MONTH,a.InvoiceDate) as CalMonth
          ,DATEPART(YEAR,a.InvoiceDate) as CalYear
          ,a.InvoiceDate
          ,a.StockCode
          ,a.QtyInvoiced
          ,a.Volume
          from sales a
          Union All
          select 
          ds.CalMonth as CalMonth
          ,ds.CalYear as CalYear
          ,ds.InvoiceDate
          ,ds.StockCode
          ,ds.Cases as QtyInvoiced
          ,ds.Vol as Volume
          from sales1 ds
          ) as t
      

      【讨论】:

        【解决方案4】:

        我认为您要么需要添加已建议的别名,要么(更复杂)删除括号,*FROM、第二个SELECT 并移动INTO foo

        SELECT  
                                                              --- removed: FROM 
                                                              --- removed: (
                                                              --- removed: SELECT 
                 DATEPART(MONTH,a.InvoiceDate) as CalMonth
                ,DATEPART(YEAR,a.InvoiceDate) as CalYear
                ,...
            INTO foo                                          --- moved
        
          FROM sales a
          UNION ALL
          SELECT ds.CalMonth as CalMonth
                ,...
          FROM sales1 ds ;
                                                              --- removed: )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          相关资源
          最近更新 更多