【问题标题】:ignore column in minus statement忽略减号语句中的列
【发布时间】:2015-01-23 00:52:57
【问题描述】:

我无法找到解决此问题的方法。

有两个表可以相互减去。

Select columnA, columnB, columnC from tableA
minus
Select columnA, columnB, columnC from tableB

我需要 tableA.columnC 中的数据,但它永远不会匹配到 tableB.columnC,因此减号语句将返回两条记录。

有没有办法从减号语句中忽略 columnC 但仍然返回结果?

-谢谢

附:关于这个问题的一点背景。我有一个交易表,其中列出了购买日期、账单金额、购买的物品(有时列出,有时不列出)、购买者的帐号和购买的唯一标识符。

此表包含购买和撤消。因此,如果有人以 10.00 的价格购买了一件商品,然后退回了该商品,则该商品的价格为 -10.00。在某些情况下,人们会在同一天内再次购买、退货和购买该商品。此数据来自第三方。

不幸的是,在这种情况下,总和不起作用,我需要所有尚未撤销的购买的逐行详细信息。

通过遵循这篇文章的建议并使用以下方法,我能够获得正确的数据: Prevent Oracle minus statement from removing duplicates

但是,我需要从这张表中获得更多信息,而不仅仅是我用来减去回报的信息。

这就是为什么我需要上述声明的帮助。

【问题讨论】:

  • 您使用的是 Oracle 还是 MySQL?

标签: sql oracle


【解决方案1】:

这些行的东西应该可以工作:

Select columnA, columnB, columnC from tableA a
where not exists
(Select 1 from tableB b where a.columnA=b.columnA and a.columnB=b.columnB)

【讨论】:

    【解决方案2】:

    试试这个:

    select cola,colb,colc from tableA as A
    inner join
    (select cola,colb from tableA
     minus
     select cola,colb from tableB) as B
     on a.cola = b.cola
     and a.colb = b.colb;
    

    【讨论】:

    • 这应该可以,但它比使用WHERE EXISTS更冗长
    • 问题出现在同一天的单件商品有五条记录,即购买、退货、购买、退货、购买。如果它在减号语句中的第一个 colA 和 colB 上,那么我将不会获得任何记录。如果我在语句上创建一个分区,我将无法提取足够的信息。我认为我可以通过循环遍历正负记录并识别匹配的反转来使用存储过程来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2021-11-15
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多