【问题标题】:If / case statement using sql query problemsif/case语句使用sql查询问题
【发布时间】:2014-02-11 17:35:43
【问题描述】:

所有, 我绞尽脑汁想找出解决这个问题的最佳方法。本质上,我想比较两个表并在满足某些条件时插入现有记录的副本 - 例如,如果名为“OrderComplete”的列是“是”或者该记录当前不存在于插入表中。我一直在寻找使用 IF 语句或 CASE,但我被 IF 部分困住了——下面是我想运行的两个查询,但是编写 IF 语句需要花很多时间。有什么想法或想法吗?

下面的两个查询都运行良好,但我需要一个条件来查找重复项,并且仅在插入表的项目“OrderComplete”设置为yes 时才进行复制。我可以放一个简单的方程式,但想在 IF 区域插入一个 SELECT 或更复杂的东西。也许你不能比较 IF 语句中的两个表,现在只是难住了。

IF ?????
BEGIN
use [PaperDB]  
INSERT INTO dbo.ORDERED_PARTS_TABLE
       ([OrderPN]
       ,[OldPN]
       ,[OldPN2]
       ,[PartDescription]
       ,[WhereUsed]
       ,[LocationStored]
       ,[LocationDescription]
       ,[AlternateLocationStored]
       ,[AlternateLocationDescription]
       ,[QuantityOnHand]
       ,[ReorderQuantity]
       ,[QuantityToOrder]
       ,[Category]
       ,[LastUpdated]
       ,[spare]
       ,[spare2]
       ,[spare3])
SELECT s.orderpn, s.oldpn, s.oldpn2, s.partdescription, s.whereused, s.locationstored,          
s.locationdescription, s.alternatelocationstored, s.alternatelocationdescription,    
s.quantityonhand, s.reorderquantity, s.reorderquantity - s.QuantityOnHand , s.category,     
s.lastupdated, s.QuantityOnHand , s.ReorderQuantity , s.Spare3 
FROM dbo.PARTS_ORDER_TABLE as s
LEFT OUTER JOIN
ORDERED_PARTS_TABLE as t
on s.OrderPN = t.OrderPN
WHERE (NOT EXISTS (SELECT *
            from ORDERED_PARTS_TABLE 
            where s.OrderPN = t.OrderPN)) 
END
ELSE 
BEGIN
use [PaperDB]  
INSERT INTO dbo.ORDERED_PARTS_TABLE
([OrderPN]
       ,[OldPN]
       ,[OldPN2]
       ,[PartDescription]
       ,[WhereUsed]
       ,[LocationStored]
       ,[LocationDescription]
       ,[AlternateLocationStored]
       ,[AlternateLocationDescription]
       ,[QuantityOnHand]
       ,[ReorderQuantity]
       ,[QuantityToOrder]
       ,[Category]
       ,[LastUpdated]
       ,[spare]
       ,[spare2]
       ,[spare3])
SELECT s.orderpn, s.oldpn, s.oldpn2, s.partdescription, s.whereused, s.locationstored,   
s.locationdescription, s.alternatelocationstored, s.alternatelocationdescription,  
s.quantityonhand, s.reorderquantity, s.reorderquantity - s.QuantityOnHand , s.category,  
s.lastupdated, s.QuantityOnHand , s.ReorderQuantity , s.Spare3 
FROM dbo.PARTS_ORDER_TABLE as s
LEFT OUTER JOIN
ORDERED_PARTS_TABLE as t
on s.OrderPN = t.OrderPN
WHERE s.OrderPN = t.OrderPN AND t.OrderComplete = 'yes'
END

【问题讨论】:

  • 我添加了 sql-server 标签,因为语法看起来像 SQL Server。
  • 一方面,将use 语句移到if 之前。他们两个。
  • 如果您使用的是 SQL Server,您能遵守吗?如果是,那是什么版本?
  • 我相信您正在寻找MERGE 声明? msdn.microsoft.com/en-us/library/bb510625.aspx
  • 感谢大家的建议 - 非常有帮助。我将尝试 Merge 命令并从那里开始。

标签: sql sql-server if-statement case


【解决方案1】:

不太确定我是否理解您的整个问题,但您不能使用带有 IF 的 EXISTS 来完成您需要的事情吗?

IF EXISTS (SELECT * FROM dbo.ORDERED_PARTS_TABLE WHERE whatever='??') THEN

【讨论】:

    【解决方案2】:

    我建议使用 MERGE 函数。

    您可以设置匹配条件并执行更新/插入/删除作为基于单个集合的操作的一部分。

    你可以在这里运行的很好的例子:

    http://www.cs.utexas.edu/~cannata/dbms/SQL%20Merge.html

    【讨论】:

      【解决方案3】:

      另一种方法是从两个表中执行选择。

      Insert into TableC(
        Col1, 
        Col2
      )
      Select
        a.Col1,
        a.Col2
      From TableA a
      join TableB b on b.ID = a.ID
                       --expand this to express the full relationship between the tables.
      where a.OrderComplete = 'yes' -- This will give you rows where OrderComplete = Yes
      or b.ID is null -- This will add also return results where TableB is missing rows.
      

      您最终会将所有内容都插入到 TableC 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多