在名为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的子查询。
感谢。
答案 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