1

我在名为 MY_ATTRIBUTES 的 Oracle 表中有以下数据示例:

Date        Emp_No  Attribute
-----------------------------------------------------
01/04/2012  1234567 APPLE
01/04/2012  1234567 ORANGE
01/04/2012  1234567 PINEAPPLE
01/04/2012  1234567 BANANA
01/04/2012  8888888 APPLE
01/04/2012  8888888 ORANGE
01/04/2012  2222222 APPLE
01/04/2012  2222222 ORANGE
01/04/2012  2222222 PINEAPPLE

根据上面的示例数据,我只需要返回仅使用 Date 和 Emp_No 的不同记录,其中这些记录包含同时具有“APPLE”和“PINEAPPLE”属性的数据</p>

所以基于这个标准,我只期望以下两个结果记录,即:

01/04/2012  1234567
01/04/2012  2222222

我希望编写一个 Oracle SQL 查询,它将根据所描述的条件返回此结果集。

我还应该指出,我需要将此 SQL 查询用作主 SELECT 的子查询。

4

7 回答 7

2

主题的变体:

with cte as 
 ( select date, empno, attribute
   from my_attributes
   where attribute in ('PINEAPPLE', 'APPLE') )
select  *
from (  select date, emp_no
        from cte
        where attribute = 'PINEAPPLE'
        intersect
        select date, emp_no
        from cte
        where attribute = 'APPLE' )

任何这些解决方案的性能将取决于 ATTRIBUTE 的选择性。如果您的碗里只有六种水果,那么您将看到整张桌子,并且只有有限的选项可以调整它们。另一方面,如果该列是一个充满果味的蔬菜水果商(比如 150 多个不同的值),那么您应该从索引中获得回报。但这仍然取决于分布和倾斜:如果 ATTRIBUTE 是 90% 的苹果和菠萝,您可能看不到索引的任何好处:在这种情况下,全表扫描仍然是更好的选择。

tl;博士

调音很难

于 2012-04-04T09:30:34.017 回答
2

尝试

SELECT DISTINCT A.Date, A.Emp_no 
FROM (SELECT * FROM MY_ATTRIBUTES WHERE ATTRIBUTE = 'APPLE') A 
INNER JOIN (SELECT * FROM MY_ATTRIBUTES WHERE ATTRIBUTE = 'PINEAPPLE' ) B ON B.Date = A.Date AND B.Emp_No = A.Emp_No 
于 2012-04-04T06:18:03.513 回答
2

可能有更有效的方法,但这应该有效:

SELECT DISTINCT DATE, EMP_NO
FROM   (
    SELECT DATE, EMP_NO
    FROM   MY_ATTRIBUTES
    WHERE  ATTRIBUTE = 'APPLE'
    INTERSECT
    SELECT DATE, EMP_NO
    FROM   MY_ATTRIBUTES
    WHERE  ATTRIBUTE = 'PINEAPPLE'
);
于 2012-04-04T06:18:35.340 回答
2

如果没有重复项(例如,同一日期的 2 个 APPLES 和 emp),这可能会更有效,因为没有连接:

SELECT DATE, EMP_NO 
FROM MY_ATTRIBUTES
WHERE ATTRIBUTE = 'APPLE' OR  ATTRIBUTE = 'PINEAPPLE'
GROUP BY DATE, EMP_NO
HAVING COUNT(*) = 2
于 2012-04-04T06:24:34.677 回答
0

您可以尝试以下方法:

SELECT DATE, EMP_NO FROM YOUR_TABLE WHERE ATTRIBUTE = 'APPLE' OR ATTRIBUTE = 'PINEAPPLE' GROUP BY DATE, EMP_NO HAVING COUNT(*) = 2;

于 2012-04-04T10:17:33.393 回答
-1
SELECT DISTINCT DATE, EMP_NO
WHERE  ATTRIBUTE IN('APPLE','PINEAPPLE')
于 2012-04-04T07:01:24.920 回答
-1
SELECT DISTINCT Emp_No, Date
FROM (
  SELECT *
  FROM MY_ATTRIBUTES m
  WHERE m.Attribute IN ('Apple','Pineapple')
  )
LIMIT 2
ORDER BY Emp_No
于 2012-04-04T07:02:43.120 回答