【问题标题】:How do I 'subtract' sql tables?如何“减去” sql 表?
【发布时间】:2009-09-03 14:41:29
【问题描述】:

这并不是我真正要寻找的减法。而且我知道它不是联合或交集......我得到了一个长而复杂的存储过程,它返回一个活动和非活动文档表。我还得到了一个类似的存储过程,它返回另一个只包含活动文档的表。

如何使用这两个存储过程获得非活动文档表?

我们使用的是 SQL Server 2005。

【问题讨论】:

  • 什么数据库,什么是表和列?
  • 这种JOIN 的“官方”名称是LEFT ANTI SEMI JOIN(至少SQL Server 在其执行计划中是这样称呼它的,我有什么资格与机器争论呢? ) 这是通过循环遍历一组中的所有行,并从另一组中与指定条件匹配的行打折来执行的。

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

您要查找的集合操作称为 MINUS,但在 SQL Server 中关键字是 EXCEPT

  SELECT ... // all documents
  EXCEPT
  SELECT ... // active documents

我相信 EXCEPT 设置操作在 SQL Server 2005 中可用。

【讨论】:

  • 这是关于底层集合操作的正确答案。
  • Sql Server 上是否存在?
  • 不在 SQL Server 中。 “这取决于”
  • 在 SQL Server 中,MINUS 的等价物称为 EXCEPT
【解决方案2】:

假设有两个表对应的唯一 ID:

select * from table_both b
where not exists (select * from table_active a where a.id = b.id)

【讨论】:

    【解决方案3】:
    SELECT * FROM Table1 
    LEFT JOIN Table2 on Table1.id = Table2.id
    WHERE Table2.id IS NULL
    

    这应该适用于几乎所有数据库引擎

    【讨论】:

    • 我对这个答案投了赞成票,因为 where Table2.id IS NULL 正是它返回反面的原因。写 WHERE Table2.id IS NULL 对我来说是反直觉的,因为我的两列都不能是 NULL... 但是!这就是魔法。谢谢你,伙计。
    【解决方案4】:

    所有好的答案,但缺少一点:提问者(OP)有存储过程......

    您必须定义临时表(基于您的平台)来加载数据

    INSERT ...
    EXEC getActive
    
    INSERT ...
    EXEC getInactive
    

    然后使用 EXCEPT/EXISTS/MINUS/IN/OUTER JOIN/等...

    【讨论】:

      【解决方案5】:
      select * from MyTable1
      where MyTable1.Field1 not in (
        select Field1 from MyTable2)
      

      【讨论】:

        【解决方案6】:

        我相信 EXCEPT 是您正在寻找的。语法类似于 UNION 或 INTERSECT。

        【讨论】:

          【解决方案7】:

          您的数据库引擎是什么?

          在 Oracle 中,您可以使用MINUS 设置操作。

          在 MS SQLServer 2005 及更高版本中,您可以使用EXCEPT

          【讨论】:

            【解决方案8】:
            SELECT both.*
            FROM both LEFT OTUER JOIN inactives USING (whatever_id)
            WHERE inactives.whatever_id IS NULL;
            

            SELECT * FROM both
            EXCEPT
            SELECT * FROM inactives;
            

            【讨论】:

              【解决方案9】:

              在 MS TSql 中,我认为您需要 EXCEPT 关键字。

              query1 EXCEPT query2
              

              这将返回在第一个查询中找到但在第二个查询中没有找到的所有行。

              【讨论】:

                【解决方案10】:

                您也可以使用NOT IN 子句来做到这一点

                例如,假设存储过程为您提供了名为 @AllDocuments@ActiveDocuments 的表变量,并且每个文档都有一个名为 DocId 的标识符列

                SELECT * FROM @AllDocuments 
                WHERE DocId NOT IN 
                    (SELECT DocId FROM @ActiveDocuments)
                

                适当调整它以匹配您的表/列名称。

                【讨论】:

                  【解决方案11】:
                  SELECT roll_number FROM profile WHERE(catagory='Attest and Eat' or catagory='Live and Eat') and status='OK' EXCEPT SELECT roll_number from meal_status  WHERE date='29' AND month='1'
                  

                  您可以尝试使用这种命令从另一个表中减去一个表。

                  【讨论】:

                    【解决方案12】:

                    为了在三个表之间做减法,我使用了以下查询:

                    基本上我有三个表.. 表 1、表 2、表 3。 首先我做了表1和表2的减法,然后做了前面查询的结果和表3的减法。

                    select v3.Material, ((v1.Qty-v2.Qty)-v3.Qty) as Quantity
                      from table1 v1, table2 v2, table3 v3
                     where (v1.Material=v2.Material
                        and v1.Material=v3.Material
                        and v2.Material=v3.Material)
                    

                    【讨论】:

                      【解决方案13】:

                      您可以只使用返回 Active & Inactive 的第一个 sp 和 在 WHERE cluse 中设置文档状态 = 不活动的条件,您将只获得不活动的文档。

                      【讨论】:

                        【解决方案14】:

                        如果您要减去百分比并更新表格,请使用此

                        UPDATE `TABLENAME` SET `COLUMNNAME` = (50 / 100) * `COLUMNNAME`;
                        

                        请注意,(50 / 100) 是 50%,因此在这种情况下,此查询将从该行的总价值中扣除 50%!

                        【讨论】:

                          猜你喜欢
                          • 2022-12-08
                          • 2022-07-07
                          • 2018-05-21
                          • 2018-04-30
                          • 2011-04-25
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-06-13
                          • 1970-01-01
                          相关资源
                          最近更新 更多