[英]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.