SQL内部加入并过滤掉结果

时间:2015-06-09 17:45:16

标签: sql database

我正在查询报告,我需要帮助INNER JOIN,我一直在努力工作数周。它除了一个更大的报告查询,但我需要帮助在这个最后部分taht应该过滤某些结果。

cwo_work_order_line_item中的每一行代表按交易顺序组合在一起的特定工单的项目。此查询正在加入此报告和cat_cust_item_acct_activity的另一个表。该表显示了处理某个帐户的不同交易。

报告的某些部分应该只显示收费为“估算”的项目。此查询完全正常,直到某个项目更改为与其设置时不同的事务的实际价格。

问题是表cwo_work_order_line_item使用不同的事务序列(trans_seq列)获取插入其中的新项目,cat_cust_item_acct_activity也获取新项目。发生这种情况而不是实际修改表示每个表的项目的原始行。

这意味着即使价格从估算更改为实际,报表仍显示报表上的原始项目(设置项目)。

这是我数据库中两个表的图片。看到这个将有助于我更好地解释问题

http://i.imgur.com/SdcVG6V.png

在图片的示例中,第一个表是cwo_work_order_line_item。 trans_seq 1052833是设置项目时的tranasction。查询仅检查这些项目是否设置为“ACTUAL”而不是“ESTIMATE”的价格,该价格在price_status_enum列中表示。

第3行显示不同的交易1052834,其中客户将商品价格更改为实际价格,因此为“ACTUAL”。

在第二个表cat_cust_item_acct_activity中,您可以看到客户完成的操作。看似连接第一个和第二个表中的项目的唯一事情是第一个表中的rtrans_lineitm_seq和第二个表中的cust_item_acct_detail_item_nbr

所以这就是我认为我需要做的事情: 我需要进行此查询以检查第二个表,以查看item_acct_activity_code中是否存在“MODIFY_PRICE”,然后检索该行的cust_item_acct_detail_item_nbr。然后确保第一个表中的行没有连接到cust_item_acct_detail_item_nbr等于第一个表中rtrans_lineitm_seq的位置

原始查询: 如果price_status_enum在设置时未在同一事务中更改或更改,则此查询有效。

SELECT
   DISTINCT(ca.cust_acct_id)                 
FROM
   cwo_work_order_acct ca              
INNER JOIN
   cat_cust_item_acct_activity acty                
      ON                      ca.organization_id = acty.organization_id                     
      AND ca.cust_acct_id = acty.cust_acct_id                     
      AND ca.cust_acct_code = acty.cust_acct_code              
INNER JOIN
   cwo_work_order_line_item cli                         
      ON                          acty.organization_id = cli.organization_id                         
      AND acty.wkstn_id = cli.wkstn_id                         
      AND acty.trans_seq = cli.trans_seq                         
      AND acty.business_date = cli.business_date                         
      AND acty.rtl_loc_id = cli.rtl_loc_id                         
      AND acty.rtrans_lineitm_seq = cli.rtrans_lineitm_seq              
      AND cli.price_status_enum ='ESTIMATE

1 个答案:

答案 0 :(得分:0)

尝试使用子选择以获取最新的序列号,如下所示:

SELECT DISTINCT(ca.cust_acct_id)                 
FROM cwo_work_order_acct ca              
INNER JOIN
(
SELECT 
    act.organization_id,
    act.wkstn_id,
    act.business_date,
    act.rtl_loc_id,
    act.rtrans_lineitm_seq,
    max(act.trans_seq) trans_seq --Get the most recent seq number
  FROM cat_cust_item_acct_activity act                
  GROUP BY
        act.organization_id,
        act.wkstn_id,
        act.business_date,
        act.rtl_loc_id,
        act.rtrans_lineitm_seq        
  ) as acty
  ON  ca.organization_id = acty.organization_id                     
  AND ca.cust_acct_id = acty.cust_acct_id                     
  AND ca.cust_acct_code = acty.cust_acct_code

INNER JOIN cwo_work_order_line_item cli                         
  ON  acty.organization_id = cli.organization_id                         
  AND acty.wkstn_id = cli.wkstn_id                         
  AND acty.trans_seq = cli.trans_seq                         
  AND acty.business_date = cli.business_date                         
  AND acty.rtl_loc_id = cli.rtl_loc_id                         
  AND acty.rtrans_lineitm_seq = cli.rtrans_lineitm_seq              
  AND cli.price_status_enum ='ESTIMATE'