繁体   English   中英

外部联接的以下用法是否正确,因为数据未正确获取

[英]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 取而代之的是,您可以使用LAGLEAD分析功能(与进行自连接的两次表扫描相比,只需要一次表扫描):

SQL小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM