繁体   English   中英

SQL查询以从两个相似的表中获取数据

[英]SQL Query for getting data from two similar tables

我有两个表,我们称它们为A和B。它们的列名相同。 但是,B完全填充,而A就像一个吃了一半的苹果。 他们有无数的字段,但我只会用其中的一个简单。 他们都有公司代码。

B有重复项(因为人们不喜欢删除数据吗?)。 因此,不幸的是,由于我得到了这些重复,因此我无法轻易将两者结合在一起。

我想做的是,每个公司代码仅从B一行中取出一行。 我只想要每个公司代码的索引最高的行(最后更新)。

然后,我想将这些行与A中的相应公司代码连接起来。但是,一个小问题是,A的某些公司代码不在B中,因此我需要在结果集中包含这些公司代码。 B拥有大部分数据,因此我根据上面的匹配从B中获取数据。 当然,对于那些公司代码仅存在于A中的条目,对于某些字段,数据将必须保留为空白。

所以..我该怎么做? 我被诱惑只在SQL调用之外执行逻辑。 但是,我调用的函数将结果集作为参数,然后从中生成文件。 因此,我要么不得不重写函数,要么创建我自己的resultSet对象,放入我想要的数据(可能会变得很丑陋)。

有任何想法吗? 我正在使用MySQL,但是我觉得如果有人可以给我一个高水平的解决方案,我应该可以将其翻译成MySQL。

由于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中没有对应公司代码的A的所有记录添加到该数据集中。

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 JOIN的原因,因为:

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

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

更准确地说,使用CASE语句:

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

因此,您仅从完全不存在b a处返回值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM