如何根据两个不同的值返回不同的记录

时间:2012-04-04 06:13:15

标签: sql oracle oracle10g

在名为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”属性的数据

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

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

希望有人可以协助Oracle SQL查询,该查询将根据所描述的标准返回此结果集。

对不起,本来应该也指出我需要将这个SQL查询用作主SELECT的子查询。

感谢。

7 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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'
);

答案 2 :(得分:2)

如果没有重复项(例如,在同一日期和emp上有2个APPL),由于没有连接,这可能更有效:

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

答案 3 :(得分: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; dr

调整很难

答案 4 :(得分:0)

您可以尝试以下操作:

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

答案 5 :(得分:-1)

SELECT DISTINCT DATE, EMP_NO
WHERE  ATTRIBUTE IN('APPLE','PINEAPPLE')

答案 6 :(得分:-1)

SELECT DISTINCT Emp_No, Date
FROM (
  SELECT *
  FROM MY_ATTRIBUTES m
  WHERE m.Attribute IN ('Apple','Pineapple')
  )
LIMIT 2
ORDER BY Emp_No