[英]Is the below use of outer join correct as the data doesn't fetch correctly
您好,我在表格中有以下数据现有数据通过以下查询,我只会得到普通凭单输出
但是我还需要没有凭证的行,该凭证具有相应的-ve(它基本上是已售出的凭证并已兑换了凭证)。
因此,仅售出和兑换了一张优惠券,还有一张尚未兑换。 我如何恢复尚未兑换的行。
SELECT t1.STORE,
t1.DAY,
t1.tran_seq_no,
t2.tran_seq_no,
t2.DAY,
t1.tender_amt,
t2.tender_amt,
t1.voucher_no,
t2.voucher_no
FROM sa_tran_tender t1,
sa_tran_tender t2
where t1.voucher_no(+)=t2.voucher_no
AND t1.DAY=4
AND t1.tender_amt<0
AND t1.tender_type_group ='VOUCH'
AND t2.tender_amt>0
AND t1.STORE=400112
AND t1.tran_seq_no IN(2632729010,2632729056,3140772029)
AND t1.STORE(+)=t2.STORE
and t1.tender_type_group(+)=t2.tender_type_group;
当您使用oracle joun语法时,应在左联接表的WHERE
条件中的每个字段中添加(+)
(不仅适用于与另一个表连接的字段)-
where t1.voucher_no(+)=t2.voucher_no
AND t1.DAY=4(+)
AND t1.tender_amt(+)<0
AND t1.tender_type_group(+) ='VOUCH'
AND t2.tender_amt>0
AND t1.STORE(+)=400112
AND t1.tran_seq_no(+) IN(2632729010,2632729056,3140772029)
AND t1.STORE(+)=t2.STORE
and t1.tender_type_group(+)=t2.tender_type_group
或者您可以使用ANSI联接。
假设将进行一次凭单销售( tender_amt
为负),然后进行一次可选的凭单赎回(凭tender_amt
是积极的,之后是tran_seq_no
),那么您无需使用自我tran_seq_no
; 取而代之的是,您可以使用LAG
或LEAD
分析功能(与进行自连接的两次表扫描相比,只需要一次表扫描):
Oracle 11g R2架构设置 :
CREATE TABLE sa_tran_tender ( store, day, tran_seq_no, voucher_no, tender_amt, tender_type_group ) AS
SELECT 400112, 4, 2632729010, '400112*101*21090', -39.95, 'VOUCH' FROM DUAL UNION ALL
SELECT 400112, 4, 2632729056, '400112*101*21136', -6.99, 'VOUCH' FROM DUAL UNION ALL
SELECT 400112, 5, 3140772029, '400112*101*21090', 39.95, 'VOUCH' FROM DUAL;
查询1 :
SELECT *
FROM (
SELECT t.*,
LEAD( DAY ) OVER ( PARTITION BY voucher_no, store, tender_type_group ORDER BY tran_seq_no ) AS redeemed_day,
LEAD( tender_amt ) OVER ( PARTITION BY voucher_no, store, tender_type_group ORDER BY tran_seq_no ) AS redeemed_amt,
LEAD( tran_seq_no ) OVER ( PARTITION BY voucher_no, store, tender_type_group ORDER BY tran_seq_no ) AS redeemed_tran_seq_no
FROM sa_tran_tender t
)
WHERE tran_seq_no IN( 2632729010, 2632729056, 3140772029)
AND tender_type_group ='VOUCH'
AND STORE =400112
AND DAY =4
结果 :
| STORE | DAY | TRAN_SEQ_NO | VOUCHER_NO | TENDER_AMT | TENDER_TYPE_GROUP | REDEEMED_DAY | REDEEMED_AMT | REDEEMED_TRAN_SEQ_NO |
|--------|-----|-------------|------------------|------------|-------------------|--------------|--------------|----------------------|
| 400112 | 4 | 2632729010 | 400112*101*21090 | -39.95 | VOUCH | 5 | 39.95 | 3140772029 |
| 400112 | 4 | 2632729056 | 400112*101*21136 | -6.99 | VOUCH | (null) | (null) | (null) |
但是,如果您确实想使用(低效的)自联接,则可以执行以下操作:
SELECT t1.STORE,
t1.DAY,
t1.tran_seq_no,
t2.tran_seq_no,
t2.DAY,
t1.tender_amt,
t2.tender_amt,
t1.voucher_no,
t2.voucher_no
FROM sa_tran_tender t1
LEFT OUTER JOIN
sa_tran_tender t2
ON ( t1.voucher_no = t2.voucher_no
AND t2.tender_amt > 0
AND t1.store = t2.store
AND t1.tender_type_group = t2.tender_type_group )
WHERE t1.DAY = 4
AND t1.tender_amt < 0
AND t1.tender_type_group = 'VOUCH'
AND t1.STORE = 400112
AND t1.tran_seq_no IN (2632729010,2632729056,3140772029);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.