sql选择具有多个参数的数据

时间:2013-09-02 14:19:59

标签: sql oracle

我坚持这个问题,请帮忙!

问题在于:

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

行明细表: 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

1 个答案:

答案 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