【问题标题】:SQL Query for getting data from two similar tables用于从两个相似表中获取数据的 SQL 查询
【发布时间】:2012-02-24 10:28:24
【问题描述】:

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

B 有重复项(因为人们不喜欢删除数据?)。 所以,不幸的是,我不能在公司代码上轻松地将两者结合在一起,因为 我得到这些重复。

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

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

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

有什么想法吗?我正在使用 MySQL,但我觉得如果有人能给我一个高级解决方案,我应该能够将其转换为 MySQL。

【问题讨论】:

  • “我只想要索引最高的行”是索引字段吗?
  • 人们的反应速度太快了!
  • 哇!这很快......所以,是的,索引一个自动递增的字段。

标签: mysql sql join


【解决方案1】:

由于 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 上没有相应的公司代码。

【讨论】:

  • 考虑到 MySQL 不支持 FULL OUTER JOIN
  • Yeah mySQL 很奇怪。
  • distinct 假定重复项将具有完全相同的记录。我理解它,因为它有重复的 company_code 但其余列可能有不同的记录。因此,只取索引值最高的那个。我可能是错的......
  • sam yi 是正确的。其他领域不同。让我添加一些其他列来给你一个想法。有公司代码、公司名称和联系人姓名。通常,表 B 中发生的情况是联系人姓名已更改,因此创建了一个新条目(我假设)。因此,公司代码和公司名称相同,但联系人姓名不同,因此我需要为每个公司代码选择一个不同的行(最后更新的行,因此包含最高索引)。
【解决方案2】:
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 优化您的输出以填充来自a 的数据,其中b 中的列为NULL。但是小心。也许有些列应该是NULL!然后你会得到不正确的结果。

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

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

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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 2013-07-15
      • 2015-11-13
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多