【问题标题】:duplicate results on join sql加入sql的重复结果
【发布时间】:2016-04-27 01:51:57
【问题描述】:

我有两个 SQL 脚本。我需要合并来自他们两个的数据。我已将它们设置为两个单独的易失性表,以便将它们连接在一起以形成我完成的报告。下面的脚本只是我试图从数据中提取的一个示例。真正的脚本非常复杂,并且有许多子查询需要使用 volitile 表而不是常规连接。连接在“customer_acct”上。此脚本的目的是生成所有订单的记录,然后在“customer_acct”绑定的列中显示是否已对所述订单应用退款。

我得到的结果给了我

CUST_ACCT    PRODUCT_ORDERED    REFUND_AMT
1111111      item#5             10.00
1111111      item#5             20.00
1111111      item#5             30.00
2222222      item#5             10.00
2222222      item#5             20.00
2222222      item#5             30.00
3333333      item#5             10.00
3333333      item#5             20.00
3333333      item#5             30.00

我的脚本总结如下。

CREATE VOLATILE TABLE ORDERS, NO LOG AS(
SELECT 
p.customer_acct
p.product_ordered
etc.
FROM server p
)WITH DATA PRIMARY INDEX (p.customer_acct)
ON COMMIT PRESERVE ROWS; 

CREATE VOLATILE TABLE REFUND, NO LOG AS(
SELECT
c.customer_acct
c.refund_amt
c.date
etc.
FROM server c
)WITH DATA PRIMARY INDEX (c.customer_acct)
ON COMMIT PRESERVE ROWS; 

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,b.refund_amt

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
;

DROP TABLE ORDERS;
DROP TABLE REFUND;

基本上,脚本会为“订单”行中的每一行返回一个结果,并将其复制到“退款”表中的每个可能值,尽管没有任何真正的匹配项。

有什么想法吗?我先道歉,因为 SQL 对我来说相对较新,我正在努力扩展我的知识。

【问题讨论】:

  • 下次请只使用相关的产品类型标签,不要随意选择那些包含字母sql的标签!
  • 感谢您的反馈@Shadow

标签: sql join teradata


【解决方案1】:

这不是您遇到问题的联接。您需要按帐号汇总退款表中的数据,以仅按帐号获取一行。

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,case when count(b.cust_Accta)=0 then 'no refund' else 'refund' end as refund

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
GROUP BY a.customer_acct

或者您可以使用 sum() 来取回退款金额:

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,sum(b.refund_amt) as refund_amount

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
GROUP BY a.customer_acct

【讨论】:

  • 感谢您的帮助。我添加了 sum() 建议,但现在我收到一个错误,即选择的非聚合值必须是关联组的一部分。我已经添加了 groupby,但仍然收到错误...
  • 那么您在查询的 select 子句中的字段比您在问题中披露的字段多。如果您没有在问题中提供完整的详细信息,我们将无法提供适当的答案!
  • 这不是我不想,而是在不提供专有数据的情况下很难发布。你能帮我理解造成这种情况的原因吗?订单表中的每条记录都发布了 3 次,因为恰好有 3 个值可用作“退款”金额。
  • 我最终发现了我的错误。感谢您的耐心@shadow
【解决方案2】:

您正在加入客户帐户。有 3 条记录,此帐户 ID 是常见的。所以它重复三次。在加入时,您需要添加另一个条件,相当于/类似于 'where A.item = B.item or A.orderno=B.orderno' 。我不能准确地写出来,因为你没有提到列名。

【讨论】:

  • 我刚刚确认没有重复。订单表中的每条记录都发布了 3 次,因为恰好有 3 个值可用作“退款”金额。
  • @CRudiger ,如果每行最初重复三次,您将有 27 行输出,因为结果集是交叉产品,在连接中没有订单号/项目号。反正你是不会明白的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2017-04-23
  • 2020-08-28
  • 2013-04-22
相关资源
最近更新 更多