SQL Query用于从两个类似的表中获取数据

时间:2012-02-01 18:10:41

标签: mysql sql join

我有两个表让我们称它们为A和B.它们的列名相同。 但是,B是完全填充的地方,因为A就像是吃了一半的苹果。 他们有很多领域,但我只会用一个来保持简单。 他们都有公司代码。

B有重复项(因为人们不喜欢删除数据?)。 所以,遗憾的是,我无法轻易将两者加入公司代码中,因为 我得到了这些重复。

我想要做的是为每个公司代码只从B中取一个不同的行。我只希望每个公司代码具有最高索引(最后更新)的行。

然后,我想在A中加入那些带有相应公司代码的行。 但是,有一点障碍是,A有一些公司代码,这些代码不在B中,我需要在结果集中使用。 B有大部分数据,所以我根据上面的匹配从B中获取数据。 当然,对于公司代码仅存在于A中的条目,某些字段的数据必须保持空白。

那么..我该怎么做?我只是想在SQL调用之外做逻辑。但是,我调用的函数将结果集作为参数,然后生成一个文件 从中。所以,我要么必须重写函数,要么创建我自己的resultSet对象,放入我想要的数据(可能会非常难看)。

有什么想法吗?我正在使用MySQL,但我觉得如果有人能给我一个高级别的解决方案,我应该能够把它翻译成MySQL。

3 个答案:

答案 0 :(得分:0)

由于MYSQL不支持完全外连接,这就是我们可以做的。

假设您有一个“索引”字段,用于获取不同的公司代码。

SELECT B.Company_Code, B.Index, B.OtherField 
  FROM B LEFT JOIN A ON (B.Company_Code = A.Company_Code)
   WHERE EXISTS (SELECT 1 FROM 
                    (SELECT Company_Code CC, 
                            max(Index) as U 
                     FROM B GROUP BY Company_Code) subq
                 WHERE subq.CC = B.Company_Code and subq.U = B.UpdateDate)
UNION
SELECT A.Company_Code, A.Index, A.OtherField 
  FROM A 
 WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.Company_Code = A.Company_Code)

基本上,从B中获取具有最高索引的所有记录,这些记录也可能存在于A. 然后将来自A的所有记录添加到该组数据中,其中B上没有相应的公司代码。

答案 1 :(得分:0)

SELECT b.*
FROM   b
JOIN  (
    SELECT c_code, max(index) AS index
    FROM   b
    GROUP  BY c_code
    ) b_max USING (c_code, index)
RIGHT  JOIN a USING (c_code)

请注意我在这里使用 RIGHT 加入的原因是:

  

A有一些公司代码,我不需要在B中   结果集

您可以使用COALESCE(b.col1, a.col1) AS col1优化输出,以填充ab中的列为空的数据。但小心。也许有些列应该是NULL!然后你得到不正确的结果。

更准确地说,使用CASE声明:

CASE WHEN b.c_code IS NULL THEN a.col1 ELSE b.col1 END AS col1

因此,您只能回到a完全不存在b的值。

答案 2 :(得分:0)

select [column list]
from A
left join (
  select [column list]
  from B
  join (company_code, max(index) maxindex
    from B
    group by company_code) maxcode
    on b.company_code = maxcode.company_code
    and b.index = maxcode.maxindex
) B_distinct
  on A.company_code = B_distinct.company_code