我坚持这个问题,请帮忙!
问题在于:
我有一个目录和行详细信息表。如;
行明细表: TRANSACTIONS_LINE_DETAIL 目录表:目录
在 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
答案 0 :(得分: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
。