【问题标题】:copy table to another with condition and join [closed]将表复制到另一个有条件并加入[关闭]
【发布时间】:2020-03-01 13:04:48
【问题描述】:

我正在尝试使用条件和连接从表复制到另一个表,但当我创建它时出现错误。

INSERT INTO [ax].[WaitingKitchenStatus]
(
    [TRANSACTIONID]--1
    , [LineNote]--2
    , [Item]--3
    , [CreationDate]--4
    , [CreationTime]--5
    , [active]--6
    ,[Gruop]--7
)

SELECT ab.COMMENT
	,[ax].[ECORESPRODUCTTRANSLATION].[NAME]
    , ab.[ITEMID]
FROM ax.RetailTransactionSalesTrans ab
inner join [ax].[INVENTTABLE] on ab.[ITEMID] =[ax].[INVENTTABLE].[ITEMID]
inner join [ax].[ECORESPRODUCTTRANSLATION] on [ax].[INVENTTABLE].PRODUCT =[ax].[ECORESPRODUCTTRANSLATION].[PRODUCT]
LEFT JOIN ax.[WaitingKitchenStatus] a ON 
a.[TRANSACTIONID]=ab.COMMENT--1
and a.[LineNote]=[ax].[ECORESPRODUCTTRANSLATION].[NAME]--2
and a.[Item]=ab.[ITEMID]--3
and a.[CreationDate]=GETDATE()--4
and a.[CreationTime]= CONVERT(time, GETDATE())--5
and a.active= 1--6
and a.Gruop=''--7
where ab.TRANSACTIONSTATUS !=1
and ab.RECEIPTID !=''
and ab.COMMENT !=''
and NOT EXISTS(select * from ax.[WaitingKitchenStatus] where active= 1 and [TRANSACTIONID]=ab.COMMENT)

我收到了这个错误

消息 120,第 15 级,状态 1,第 1 行
INSERT 语句的选择列表包含的项目少于插入列表。 SELECT 值的数量必须与 INSERT 列的数量相匹配。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 错误似乎很明显。您的 insert 需要 7 列,但您只提供 3 列。示例数据、所需结果和逻辑解释将帮助其他人了解您实际尝试做什么。
  • 感谢重播,其他表不需要从其他表复制

标签: sql sql-server select sql-insert sql-server-2016


【解决方案1】:

您不需要其他列的前提没有意义,您的查询也没有意义。别名引用可能会被显着清理,并尝试使用不同的列名来遵循您的结构有点混乱。老实说抱歉,但让我们从...开始了解 SQL 插入的基础知识。正如 Gordon 所提到的,您尝试插入 7 列,但只选择 3。那是您的失败。它应该是

的格式示例
insert into YourTable
   ( YourColumn1,
     YourColumn2,
     YourColumnX,
     YourColumnZ
   )
   select
         HYH.YourColumn1,
         HYH.YourColumn2,
         HYH.YourColumnX,
         HYH.YourColumnZ
      from
         HoweverYourHaveOtherTablesAndJoins HYH

注意插入的列数与选择时完全相同。现在,查看您的查询 FROM/JOINs。通常更容易让缩写在某种程度上引用原始表名。例如:

FROM ax.RetailTransactionSalesTrans ab
  inner join [ax].[INVENTTABLE] on ab.[ITEMID] = [ax].[INVENTTABLE].[ITEMID]
  inner join [ax].[ECORESPRODUCTTRANSLATION] 
     on [ax].[INVENTTABLE].PRODUCT =[ax].[ECORESPRODUCTTRANSLATION].[PRODUCT]
  LEFT JOIN ax.[WaitingKitchenStatus] a ON … etc.

我会更改以去除所有 [] 上下文,并更好地使用表别名引用与“a”、“ab”和其他使用完整 database.table.column 引用的引用。

INSERT INTO ax.WaitingKitchenStatus
(
   TransactionID, 
   LineNote, 
   Item, 
   CreationDate,
   CreationTime, 
   Active,
   -- Is this really Gruop? or Group?  If Group, you would need 
   -- `ticks` around it to not be confused with Group by clause
   Gruop
)
SELECT
      RTST.Comment,
      EPT.Name,
      RTST.ItemID,
      WKS.CreationDate,
      WKS.CreationTime,
      WKS.active,
      WKS.Gruop
   from
      ax.RetailTransactionSalesTrans RTST
         inner join ax.InventTable InvT
            on RTST.ItemID = InvT.ItemID
            inner join ax.EcoresProductTranslation EPT
               on InvT.Product = EPT.Product
               LEFT JOIN ax.WaitingKitchenStatus WKS
                  ON RTST.Comment = WKS.TransactionID  -- 1
                 and EPT.Name = WKS.LineNote           -- 2
                 and RTST.ItemID = WKS.Item            -- 3
                 and WKS.CreationDate = GETDATE()      -- 4
                 and WKS.CreationTime = CONVERT(time, GETDATE())  --5
                 and WKS.active = 1                   -- 6
                 and WKS.Gruop = ''                   -- 7
   where 
          RTST.TransactionStatus != 1
      and RTST.ReceiptID != ''
      and RTST.Comment != ''
      and NOT EXISTS( select * 
                         from ax.WaitingKitchenStatus WKS2
                         where WKS2.active= 1 
                           and WKS2.TransactionID = RTST.Comment )

我相信您会同意,没有所有 [xx].[xxxxx] 括号和 database.table.column 引用现在缩写为更有意义的别名引用更容易理解。此外,缩进有助于查找 A 连接到 B 连接到 C 的位置等的可读性。

您似乎已经包含了 --1、--2 等到 --7 的指示,表示您的 7 列在哪里,这就是插入的选择列的一部分。并将列名更改为上下文(例如:TransactionID = Comment?我认为没有人会猜到这种相关性,但它似乎是您的餐厅系统的工作方式。

最后,在 LEFT-JOINING 到您的厨房状态与 JOIN 时,我只能猜测但不会。希望我在这里提供的一些内容对您有所帮助,但是使用 Left-Join to kitchen status 可能允许在插入期间将 NULL 值插入到相应的列中,但是,嘿,这是我正在使用的根据提供的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2014-03-12
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多