当结果仅匹配1 db的参数时,从3 dbs获取查询结果

时间:2016-11-02 17:39:03

标签: mysql union multiple-databases

假设我有3家公司都有客户。我想编写一个代码,搜索所有3家公司的已终止和下岗的客户,然后返回该客户所在的所有公司,无论客户与这些公司的状态如何。

我拥有的最佳代码是:

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

此代码仅返回符合已终止过滤器的客户帐户,因此,如果我的客户在公司A中有终止代码但在B中有正常帐户,则只返回她有A帐户。 我喜欢它返回' A + B'对于该客户,只要客户账户中的任何一个满足过滤器,就应该返回客户拥有账户的所有公司。

我能想到的最好的解决方案是UNIONing所有3家公司之间的所有帐户,然后在UNION之外的OR语句中应用过滤器,但运行它需要很长时间冻结,我甚至不确定它是否会起作用。 / p>

有什么想法吗?

1 个答案:

答案 0 :(得分: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