在Oracle中查询一对多相同的表

时间:2016-11-24 09:15:08

标签: sql oracle

我在下面的表格中有如下样本数据:

prod    seq catid
-------------------
prod1   0   10
prod1   1   20
prod1   2   30
prod1   3   40
prod2   0   10
prod3   0   10
prod3   1   20
prod3   2   30
prod4   0   10

我需要根据catid列查询上面的表格。 例如:如果我用catid - 10查询,那么我需要获得所有产品(这里prod2,prod3,prod4),其中只有catid为10,其他所有产品都应排除在外。 同样的方式如果我用catid = 10 20 30查询然后我需要输出为prod3,如果我用catid查询为10 20 30 40那么我的输出应该是prod1。

SELECT * FROM table WHERE catid = ALL (1,2,3,4,5)

我在查询中尝试使用ALL,但我无法获得所需的输出,请帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用查询获得预期的prod值:

SELECT prod
FROM mytable
GROUP BY prod
HAVING COUNT(DISTINCT catId) = 5 AND 
       COUNT(CASE WHEN catId NOT IN (1,2,3,4,5) THEN 1 END) = 0

上述查询会返回具有5 不同 catId值的产品。这些值中的任何一个都不属于(1,2,3,4,5)个值集。

答案 1 :(得分:0)

执行此操作的一种方法是使用条件聚合:

#! /bin/csh -f

set begDate_r = `date +%s`
set endDate_r = `date +%s`

set secs = `echo "$endDate_r - $begDate_r" | bc`
set h = `echo $secs/3600 | bc`
set m = `echo "$secs/60 - 60*$h" | bc`
set s = `echo $secs%60 | bc`

echo "Formatted Time: $h HOUR(s) - $m MIN(s) - $s SEC(s)"

答案 2 :(得分:0)

这是一种更通用的方法 - 它依赖于您将字符串传递给查询中包含逗号分隔列表(无空格)的查询:

WITH   your_table AS (SELECT 'prod1' prod, 0 seq, 10 catid FROM dual UNION ALL
                      SELECT 'prod1' prod, 0 seq, 20 catid FROM dual UNION ALL
                      SELECT 'prod1' prod, 0 seq, 30 catid FROM dual UNION ALL
                      SELECT 'prod1' prod, 0 seq, 40 catid FROM dual UNION ALL
                      SELECT 'prod2' prod, 0 seq, 10 catid FROM dual UNION ALL
                      SELECT 'prod3' prod, 0 seq, 10 catid FROM dual UNION ALL
                      SELECT 'prod3' prod, 0 seq, 20 catid FROM dual UNION ALL
                      SELECT 'prod3' prod, 0 seq, 30 catid FROM dual UNION ALL
                      SELECT 'prod4' prod, 0 seq, 10 catid FROM dual)
-- end of mimicking your table with sample data in it
-- see sql below:
SELECT   yt.prod
FROM     your_table yt
GROUP BY yt.prod
HAVING   min(CASE WHEN ','||:p_string_to_compare||',' LIKE '%,'||yt.catid||',%' THEN 'Y'
                  ELSE 'N'
             END) = 'Y'
AND      count(*) = regexp_count(:p_string_to_compare, ',') + 1;

使用:p_string = '10,40,30,20':

PROD
-----
prod1

使用:p_string = '10,20,30':

PROD
-----
prod3

使用:p_string = '10,20':

no rows returned

使用:p_string = '10':

PROD
-----
prod4
prod2