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>

したがって、この基準に基づいて、次の2つの結果レコードのみを期待します。

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

説明されている基準に基づいてこの結果セットを返すOracleSQLクエリを作成しようとしています。

また、このSQLクエリをメインSELECTのサブクエリとして使用する必要があることも指摘しておく必要があります。

4

7 に答える 7

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

重複がない場合 (例: 同じ日付で emples が 2 つある場合)、結合がないため、より効率的である可能性があります。

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 に答える
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

チューニングが難しい

于 2012-04-04T09:30:34.017 に答える
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 に答える