2016-11-02 8 views
0

私はすべての顧客が3つの会社を持っていると言います。私は、解雇された顧客の3社すべてを検索し、それらの顧客のステータスにかかわらず、その顧客が顧客であるすべての企業を返すコードを書く必要があります。結果が1 dbのパラメータと一致する場合の3 dbsからのクエリ結果の取得

私が持っている最高のコードは次のとおりです。

SELECT 
x.name, 
x.social, 
    CASE 
    when (SUM(x.company) = 1) then ('A') 
    when (SUM(x.company) = 2) then ('B') 
    when (SUM(x.company) = 4) then ('C') 
    when (SUM(x.company) = 3) then ('A + B') 
    when (SUM(x.company) = 5) then ('A + C') 
    when (SUM(x.company) = 6) then ('B + C') 
    when (SUM(x.company) = 7) then ('X') 
    else NULL end AS company 

FROM 
(SELECT 
a.name as name, 
a.socsec, 
("1") AS company 
FROM 
a 
WHERE 
    (a.status = 'Active') AND 
    ((a.trans IN ('Payroll','HR')) AND 
    (a.result IN ('Terminated','LaidOff')) 
GROUP BY 
    a.socsec 

UNION 

SELECT 
b.name as name, 
b.socsec, 
("2") AS company 
FROM 
b 
WHERE 
    (b.status = 'Active') AND 
    ((b.trans IN ('Payroll','HR')) AND 
    (b.result IN ('Terminated','LaidOff')) 
GROUP BY 
    b.socsec 

UNION 

SELECT 
c.name as name, 
c.socsec, 
("4") AS company 
FROM 
c 
WHERE 
    (c.status = 'Active') AND 
    ((c.trans IN ('Payroll','HR')) AND 
    (c.result IN ('Terminated','LaidOff')) 
GROUP BY 
    c.socsec) idx 

GROUP BY 
x.socsec 
ORDER BY 
company 

だけ私はBでA社での終了コードが、通常のアカウントと顧客を持っているので、もし、終了フィルタを満たし、顧客の口座を返します。このコードは、その顧客のアカウントにAとBを返すようにしています。お客様のアカウントのいずれかがフィルタを満たしている限り、お客様がアカウントを持っているすべての企業に返す必要があります。 。

私が考えることができる最も良い解決策は、3つの企業の間のすべてのアカウントを結合し、UNION外のORステートメントにフィルタを適用することでしたが、動作させるには時間がかかります。

どのような考えですか?

答えて

0

私はこれがうまくいくと思っていましたが、それは凍結するまでに時間がかかっています。私のシステムでは扱えない解決策でしょうか?

SELECT 
x.name, 
x.social, 
CASE 
    when (SUM(x.company) = 1) then ('A') 
    when (SUM(x.company) = 2) then ('B') 
    when (SUM(x.company) = 4) then ('C') 
    when (SUM(x.company) = 3) then ('A + B') 
    when (SUM(x.company) = 5) then ('A + C') 
    when (SUM(x.company) = 6) then ('B + C') 
    when (SUM(x.company) = 7) then ('X') 
    else NULL end AS co 

FROM 
(
    SELECT 
    a.name, 
    a.social, 
    ("1") AS company 
    FROM a 

UNION 

    SELECT 
    b.name, 
    b.social, 
    ("2") AS company 
    FROM b 

UNION 

    SELECT 
    c.name, 
    c.social, 
    ("4") AS company 
    FROM c 
) idx 

LEFT OUTER JOIN a ON a.social = x.social 
LEFT OUTER JOIN b ON b.socsec = x.socsec 
LEFT OUTER JOIN c ON c.socsec = x.socsec 

WHERE 
((a.status = 'Active') AND 
(a.balance > 0.00) AND 
(a.trans IN ('Payroll','HR')) AND 
(a.result IN ('Terminated','LaidOff'))) 
OR 
((b.status = 'Active') AND 
(b.balance > 0.00) AND 
(b.trans IN ('Payroll','HR')) AND 
(b.result IN ('Terminated','LaidOff'))) 
OR 
((c.status = 'Active') AND 
(c.balance > 0.00) AND 
(c.trans IN ('Payroll','HR')) AND 
(c.result IN ('Terminated','LaidOff'))) 

GROUP BY x.social 
ORDER BY co 
+0

これは確かに実用的な解決策です –

関連する問題