web-dev-qa-db-ja.com

AWSAthenaのネストされたクエリの選択肢

重複しないfirst_party_idのセット(あるサードパーティに関連付けられているが別のサードパーティには関連付けられていないID)を提供するクエリを実行しています。このクエリはAthenaでは実行されませんが、エラーが発生します:Correlated queries not yet supported.

ネストされたクエリの代わりに、prestodbドキュメント https://prestodb.io/docs/current/sql/select.html (Athenaは内部でprestodbです)を見ていました。与えられたwith statementの例は、このnot in句に対してうまく翻訳されていないようです。ネストされたクエリの代替手段は何か疑問に思う-以下のクエリ。

SELECT 
         COUNT(DISTINCT i.third_party_id) AS uniques
FROM 
         db.ids i
WHERE
         i.third_party_type = 'cookie_1'
         AND i.first_party_id NOT IN (
           SELECT
             i.first_party_id
           WHERE 
             i.third_party_id = 'cookie_2'
         )
7
pauld

これを行うためのより良い方法があるかもしれません-私もそれを見たいと思います!私が考えることができる1つの方法は、外部結合を使用することです。 (データがどのように構造化されているか正確にはわからないので、不自然な例を許してください。ただし、問題なく翻訳されることを願っています。)これはどうですか?

with 
  a as (select * 
       from (values 
       (1,'cookie_n',10,'cookie_2'), 
       (2,'cookie_n',11,'cookie_1'),
       (3,'cookie_m',12,'cookie_1'),
       (4,'cookie_m',12,'cookie_1'),
       (5,'cookie_q',13,'cookie_1'),
       (6,'cookie_n',13,'cookie_1'),
       (7,'cookie_m',14,'cookie_3')
       ) as db_ids(first_party_id, first_party_type, third_party_id, third_party_type)
      ),
  b as (select first_party_type 
        from a where third_party_type = 'cookie_2'),
  c as (select a.third_party_id, b.first_party_type as exclude_first_party_type 
        from a left join b on a.first_party_type = b.first_party_type 
        where a.third_party_type = 'cookie_1')
select count(distinct third_party_id) from c 
       where exclude_first_party_type is null;

お役に立てれば!

9
Jeff G

外部結合を使用できます。

SELECT 
         COUNT(DISTINCT i.third_party_id) AS uniques
FROM 
         db.ids a
LEFT JOIN
         db.ids b
ON       a.first_party_id = b.first_party_id
     AND b.third_party_id = 'cookie_2'
WHERE
         a.third_party_type = 'cookie_1'
     AND b.third_party_id is null -- this line means we select only rows where there is no match

条件は常に真になるため、NULL値を返す可能性のあるサブクエリにNOT INを使用する場合も、注意が必要です。クエリはa.first_party_idNULLと比較していますが、これは常にfalseになるため、NOT INは条件が常にtrueになります。厄介な小さな落とし穴。

これを回避する1つの方法は、NOT INの使用を回避するか、サブクエリに条件を追加することです(例:AND third_party_id IS NOT NULL)。

詳細な説明については、 ここ を参照してください。

0
Jon Norman