【问题标题】:How to reconcile common rows in two tables columnwise in oracle?如何在oracle中按列协调两个表中的公共行?
【发布时间】:2012-05-11 17:28:25
【问题描述】:

我在一个数据库中有两个表。这些表称为 bi_employee 和 hr_employee。这两个表几乎没有相似的列,然后是每个表特有的其他额外列。

我需要根据一些用户定义的列来协调这两个表之间的数据。

假设常见的列是 id(pk)、emp_code、区域、国家、标题、部门等。

现在,当我协调这两个表时,我想查看两个表中存在但仅在某些列中不同的行。

例如emp_code 1000 出现在两个表中,但在 hr_employee 中,他的头衔是 jr。开发人员,但在 bi_employee 中,他的头衔是 sr.developer。

我不想要在一个表中但不在另一个表中的记录。

我只需要协调两个表中存在的行,但按列排列,这些行将由用户选择。

用户可以根据标题或地区或国家或所有这些选择对帐。

请帮忙。

编辑 1:

这是我到目前为止所做的,通过以下查询,我可以获得两个表中的所有记录。现在我只需要比较他们的列,看看是否有任何不匹配。

SELECT emp_code FROM bi_employee INTERSECT SELECT emp_code FROM hr_employee 

【问题讨论】:

  • 这里的最终目标是使 BI 表与 HR 表匹配,还是您真的需要获取关于差异的报告?
  • @大卫奥尔德里奇。我只需要获取有关差异的报告。

标签: sql oracle


【解决方案1】:

据我了解,每个表中只有一列与重新编码相关; emp_code。然后你想显示每个表中emp_code 相同但其他字段不同的记录。

您可以通过WHERE 子句中的简单连接和过滤器来做到这一点...

SELECT
  *
FROM
  bi_employee
INNER JOIN
  hr_employee
    ON bi_employee.emp_code = hr_employee.emp_code
WHERE
     (bi_employee.title  <> hr_employee.title)
  OR (bi_employee.region <> hr_employee.region)
  etc, etc

(如果有任何字段可以为空,您需要使用ISNULL(bi.x, '') &lt;&gt; ISNULL(hr.x, '') 之类的内容来说明这一点)。

【讨论】:

    【解决方案2】:

    你可以试试这个。

    select hr.<list of columns to reconcile from hr table> 
      from bi_employee bi join hr_employee hr on hr.emp_code = bi.empcode
    minus
    select bi.<list of columns to reconcile from bi table> 
      from bi_employee bi join hr_employee hr on hr.emp_code = bi.empcode
    

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多