我有两个表让我们称它们为A和B.它们的列名相同。 但是,B是完全填充的地方,因为A就像是吃了一半的苹果。 他们有很多领域,但我只会用一个来保持简单。 他们都有公司代码。
B有重复项(因为人们不喜欢删除数据?)。 所以,遗憾的是,我无法轻易将两者加入公司代码中,因为 我得到了这些重复。
我想要做的是为每个公司代码只从B中取一个不同的行。我只希望每个公司代码具有最高索引(最后更新)的行。
然后,我想在A中加入那些带有相应公司代码的行。 但是,有一点障碍是,A有一些公司代码,这些代码不在B中,我需要在结果集中使用。 B有大部分数据,所以我根据上面的匹配从B中获取数据。 当然,对于公司代码仅存在于A中的条目,某些字段的数据必须保持空白。
那么..我该怎么做?我只是想在SQL调用之外做逻辑。但是,我调用的函数将结果集作为参数,然后生成一个文件 从中。所以,我要么必须重写函数,要么创建我自己的resultSet对象,放入我想要的数据(可能会非常难看)。
有什么想法吗?我正在使用MySQL,但我觉得如果有人能给我一个高级别的解决方案,我应该能够把它翻译成MySQL。
答案 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
优化输出,以填充a
中b
中的列为空的数据。但小心。也许有些列应该是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