我如何'减去'sql表?

时间:2009-09-03 14:41:29

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

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

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

我们正在使用SQL Server 2005。

14 个答案:

答案 0 :(得分:39)

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

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

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:8)

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

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

INSERT ...
EXEC getActive

INSERT ...
EXEC getInactive

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

答案 3 :(得分:6)

SELECT * FROM Table1 
LEFT JOIN Table2 on Table1.id = Table2.id
WHERE Table2.id IS NULL

这几乎适用于任何数据库引擎

答案 4 :(得分:3)

select * from MyTable1
where MyTable1.Field1 not in (
  select Field1 from MyTable2)

答案 5 :(得分:3)

我相信EXCEPT就是你要找的。语法类似于UNION或INTERSECT。

答案 6 :(得分:2)

你的数据库引擎是什么?

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

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

答案 7 :(得分:2)

SELECT both.*
FROM both LEFT OTUER JOIN inactives USING (whatever_id)
WHERE inactives.whatever_id IS NULL;

SELECT * FROM both
EXCEPT
SELECT * FROM inactives;

答案 8 :(得分:1)

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

query1 EXCEPT query2

将返回第一个查询中找到的所有行,这些行在第二个查询中也找不到。

答案 9 :(得分:1)

您也可以使用NOT IN子句

执行此操作

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

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

根据需要调整此选项以匹配您的表/列名称。

答案 10 :(得分:0)

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'

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

答案 11 :(得分:0)

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

基本上我有三张桌子..表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)

答案 12 :(得分:0)

你可以使用第一个返回Active& amp;不活跃和 在WHERE cluse put document for document status = inactive,你只会获得非活动文件。

答案 13 :(得分:0)

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

$cart = get_post_meta( $post->ID, 'wcssc_cart_data' );

if ( !empty( $cart ) ) {
  $cart = $cart[ 0 ];
}
foreach ( $cart as $cart_item_key => $cart_item ) {

  $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item\[ 'data'\ ], $cart_item, $cart_item_key );
  $product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item\[ 'product_id'\ ], $cart_item, $cart_item_key );

  if ( $_product && $_product->exists() && $cart_item\[ 'quantity'\ ] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {

    $product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );

    ///MY CODE START
    $value1 = apply_filters( 'woocommerce_cart_item_subtotal',
      WC()->cart->get_product_subtotal( $_product, $cart_item\[ 'quantity'\ ] ),
      $cart_item, $cart_item_key );

    $total_cart += $value1;

请注意(50/100)表示50%,因此在这种情况下,此查询将从行的总值中减去50%!