2017-07-14 4 views
0

Database-MySql複合sqlQuery

次はcreate table文です。

CREATE TABLE `Test`(`T` varchar(40) DEFAULT NULL,`P` varchar(40) NOT NULL,`CT` char(1) DEFAULT 'V',`XY` char(1) DEFAULT 'A'); 

上記の表には3つの列(T、P、CT、XY)があります。 1.カラム 'T'とカラム 'P'は、両方のカラムの値がペアになるような関係を持ちます。ペア内の値は他の列の他の値とペアになりません。 2. CTには、> V、W、Xの3種類の値があります。 3.列XYには、> A、B、Cの3種類の値があります。

表中のデータは以下の通りです。

1. insert into Test values('T1','P1','V','A'); 
2. insert into Test values('T1','P2','V','B'); 
3. insert into Test values('T2','P3','V','C'); 
4. insert into Test values('T3','P3','V','A'); 
5. insert into Test values('T4','P4','V','A'); 
6. insert into Test values('T4','P4','V','A'); 
7. insert into Test values('T4','P4','V','B'); 
8. insert into Test values('T4','P4','W','A'); 
9. insert into Test values('T4','P4','X','A'); 

出力は一列になり - T4、P4,2

出力の説明

1. First row will be discarded because of T1 is making pair with 2 values(P1,P2)of Column 'P'. 
2. Second row will be discarded because of T1 is making pair with 2 values(P1,P2)of Column 'P'. 
3. Third row will be discarded because of P3 is making pair with 2 values(T2,T3)of Column 'T'. 
4. Fourth row will be discarded because of P3 is making pair with 2 values(T2,T3)of Column 'T'. 
5. Output will be pair of T4,P4 

第三列カウント、対(T4、P4)のためのように導出されます列 'CT'値がVで列XY値がAであるインスタンスの数は2です(uは行5と行6で見られるように)ので、出力の3番目の列は2になります。

Iクエリを使用しようとしましたが、giviではありません私は正しい結果を返します。

select T,P,sum from (select T,P,sum(if(CT = 'A' and XY = 'B',1,0)) sum from Test group by T,P) X group by T having count(*)=1; 

上記の問題を解決するSqlクエリは何ですか?

+0

行の選択方法を簡単に説明できますか? –

+0

であり、これが何のために使用されているかという目的のより良い文脈である。 「ジェネリック」を作ろうとすると、文脈が失われてしまうことがあります。 – DRapp

答えて

0

行われているように出力が生成される方法のご説明の最初の4つの項目はすべて、見つける、および除外する集計クエリを使用してTPいずれかがTPのすべてのユニークな組み合わせの中に複製された例を満足させることができますここでは、サブクエリで:

select 
    t.T, t.P, count(*) as rows 
from 
    Test as t 
    left join (
     select T from (select distinct T, P from Test) as p1 group by T having count(*) > 1 
     ) as dupT on dupT.T=t.T 
    left join (
     select P from (select distinct T, P from Test) as p2 group by P having count(*) > 1 
     ) as dupP on dupP.P=t.P 
where 
    dupT.T is null 
    and dupP.P is null 
    and CT = 'V' 
    and XY = 'A' 
group by 
    t.T, t.P; 

これは悪いデータを破棄、あなたの基準をかなり文字通りに解釈されていますが、唯一の良いデータを含むことによって、これを実行することができます。

select 
    t.T, t.P, count(*) as rows 
from 
    Test as t 
    inner join (
     select T from (select distinct T, P from Test) as p1 group by T having count(*) = 1 
     ) as dupT on dupT.T=t.T 
    inner join (
     select P from (select distinct T, P from Test) as p2 group by P having count(*) = 1 
     ) as dupP on dupP.P=t.P 
where 
    CT = 'V' 
    and XY = 'A' 
group by 
    t.T, t.P; 
+0

何度も 'Test'テーブルが反復処理されていますが、最小化できますか? –

+0

ご使用のMySQLのバージョンがCTEをサポートしている場合、繰り返されるサブクエリ「Select different T、P from Test」をCTE *に引き出すと、パフォーマンスが向上する可能性があります。これを確認するには、 'EXPLAIN'コマンドを使用して、この変更の有無にかかわらずクエリプランを確認します。 'T'、' P'、 'CT'、' XY'のインデックスもパフォーマンスを向上させる可能性があります。 –

関連する問題