1

私はOracle SQLで取り組んでいる問題があり、これはこのようなものです。

テーブル

 PurchaseID    CustID      Location  
----1------------1-----------A  
----2------------1-----------A    
----3------------2-----------A  
----4------------2-----------B  
----5------------2-----------A  
----6------------3-----------B  
----7------------3-----------B  

テーブルをクエリして、同じ顧客が別の場所で購入したすべてのインスタンスを返すことに興味があります。したがって、上記の表については、次のようにします。

出力

PurchaseID    CustID      Location  
----3------------2-----------A  
----4------------2-----------B  
----5------------2-----------A  

これを達成する方法についてのアイデアはありますか? 私はそれを行う方法を考えることができませんでした.私のアイデアのほとんどは、かなりぎこちないようです. 私が使用しているデータベースには 100 万件以上のレコードがあるため、実行速度が遅くなりたくないのです。

どんな助けでも大歓迎です。ありがとう!

4

6 に答える 6

8
SELECT *
FROM YourTable T
WHERE CustId IN (SELECT CustId
                 FROM YourTable
                 GROUP BY CustId
                 HAVING MIN(Location) <> MAX(Location))
于 2013-08-23T17:38:03.480 に答える
7

次のようなものを使用できるはずです。

select purchaseid, custid, location
from yourtable
where custid in (select custid
                  from yourtable
                  group by custid
                  having count(distinct location) >1);

SQL Fiddle with Demoを参照してください。

WHERE 句のサブクエリは、custids個別の場所の合計数が 1 より大きいすべてを返しています。

于 2013-08-23T17:40:35.420 に答える
6

英語で:

同じ顧客で場所が異なる別の行が存在する場合は、行を選択します。

SQL では:

SELECT *
FROM atable t
WHERE EXISTS (
  SELECT *
  FROM atable
  WHERE CustID = t.CustID
    AND Location <> t.Location
);
于 2013-08-23T18:10:47.840 に答える
0

これには、完全なテーブル スキャンが 1 回だけ必要です。

create table test (PurchaseID number, CustID number, Location varchar2(1));
insert into test values (1,1,'A');
insert into test values (2,1,'A');
insert into test values (3,2,'A');
insert into test values (4,2,'B');
insert into test values (5,2,'A');
insert into test values (6,3,'B');
insert into test values (7,3,'A');

with repeatCustDiffLocations as (
    select PurchaseID, custid, location, dense_rank () over (partition by custid order by location) r
    from test)
select b.*
from repeatCustDiffLocations a, repeatCustDiffLocations b
where a.r > 1
and a.custid = b.custid;
于 2013-08-23T18:45:54.387 に答える
0

サブクエリを使用したアプローチの 1 つを次に示します。

SELECT T1.PurchaseID
        ,T1.CustID
        ,T1.Location
FROM    YourTable T1
INNER JOIN
        (SELECT T2.CustID
                ,COUNT (DISTINCT T2.Location )
        FROM    YourTable T1
        GROUP BY
                T2.CustID
        HAVING  COUNT (DISTINCT T2.Location )>1
        ) SQ
ON      SQ.CustID = T1.CustID
于 2013-08-23T17:40:07.090 に答える