0

我遇到了这个问题,请帮忙!

这是问题所在:

我有一个目录和行详细信息表。如;

行明细表:TRANSACTIONS_LINE_DETAIL目录表:CATALOG

TRANSACTIONS_LINE_DETAIL表中:包括 SQ_TRANSACTION_LINE_DETAIL_ID、RF_TRANSACTION_ID、CH_ITEM_CODE、.. 列。

CATALOG表中:包括 CH_ITEM_CODE、CH_ITEM_NAME、.. 列。(CH_ITEM_CODE 是唯一的)

TRANSACTIONS_LINE_DETAIL 表和 CATALOG 表通过它们的 CH_ITEM_CODE 列相互关联。

所以我的问题是;

我想编写一个查询来获取我的事务 ID (RF_TRANSACTION_ID),其中包含 X、Y 和 Z 项目名称。(CH_ITEM_NAME)。

下面的代码帮不了我;

                        SELECT RF_TRANSACTION_ID
                          FROM TRANSACTIONS_LINE_DETAIL TLD,  CATALOG CAT 
                         WHERE TLD.CH_ITEM_CODE= CAT.CH_ITEM_CODE
                           AND CAT.CH_ITEM_NAME IN ('X', 'Y', 'Z')
                      GROUP BY RF_WO_ID
                        HAVING COUNT(1) = 3

查询应该获取我可以拥有的交易 ID;

X、Y、Z

或者

A、B、C、X、Y、Z

或者

X、Y、Z、P

不是

X

或者

X, Y

或者

Z、Y、A、B

4

1 回答 1

0

您需要将条件移至having子句:

SELECT RF_TRANSACTION_ID
FROM TRANSACTIONS_LINE_DETAIL TLD join
     CATALOG CAT 
     on TLD.CH_ITEM_CODE = CAT.CH_ITEM_CODE
where cat.ch_item_name in ('X', 'Y', 'Z')
GROUP BY RF_TRANSACTION_ID
HAVING sum(case when CAT.CH_ITEM_NAME = 'X' then 1 else 0 end) > 0 and
       sum(case when CAT.CH_ITEM_NAME = 'Y' then 1 else 0 end) > 0 and
       sum(case when CAT.CH_ITEM_NAME = 'Z' then 1 else 0 end) > 0;

这是“set-within-sets”查询的一个示例。我喜欢用子句中的逻辑来做这些having,因为它使它更通用。

此版本包含一个where子句,它(在您的情况下)使查询更有效。

子句中的每个条件都在having计算与特定条件匹配的行。

Q例如,添加非常容易(此条件在您的查询中,但不在示例结果中):

SELECT RF_TRANSACTION_ID
FROM TRANSACTIONS_LINE_DETAIL TLD join
     CATALOG CAT 
     on TLD.CH_ITEM_CODE = CAT.CH_ITEM_CODE
GROUP BY RF_TRANSACTION_ID
HAVING sum(case when CAT.CH_ITEM_NAME = 'X' then 1 else 0 end) > 0 and
       sum(case when CAT.CH_ITEM_NAME = 'Y' then 1 else 0 end) > 0 and
       sum(case when CAT.CH_ITEM_NAME = 'Z' then 1 else 0 end) > 0 and
       sum(case when CAT.CH_ITEM_NAME = 'Q' then 1 else 0 end) > 0;

如果您想查找包含 X、Y、Z 而不是Q 的交易,则最后一个条件是= 0

于 2013-09-02T14:40:55.410 回答