SQL:基于联合所有联接的SET主记录

时间:2015-11-17 17:19:44

标签: sql pervasive pervasive-sql

我加入了两个普及的数据库。这两个数据库可能具有相同的社会保险号。我正在尝试为这些多个记录中的每一个设置主记录。主要记录应该是最早的Orig_Hire日期和Active =' A'

database_1.demographics
Ss_No        Orig_Hire    Active
111-00-1111  2015-01-01   A
111-00-1111  2014-01-01   T
111-00-1111  2015-08-07   A

database_2.demographics
Ss_No        Orig_Hire    Active
111-00-1111  2013-01-01   T
111-00-1111  2012-01-01   T

这是我的问题:

SELECT demo.*, 
(select (some logic) from demo WHERE GROUP BY Ss_No) As Primary_Record //this doesnt work
FROM
    (SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
    UNION ALL
    SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics) demo

还有另一种更好的方法吗?

由于

2 个答案:

答案 0 :(得分:0)

您需要分两部分来完成。

首先找到最小值,然后得到与该分钟匹配的记录。

让你的问题简化你的工会demo

SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
UNION ALL
SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics

因此,找到每个MIN的{​​{1}}日期的逻辑将是

SSN

现在你需要找到完整的记录。

SELECT Ss_No, MIN(Orig_Hire) as Orig_Hire    
FROM demo
WHERE Active = 'A'
GROUP BY Ss_No
  • 如果SELECT demo.* FROM demo LEFT JOIN ( SELECT Ss_No, MIN(Orig_Hire) as Orig_Hire FROM demo WHERE Active = 'A' GROUP BY Ss_No ) min_hire ON demo.Orig_Hire = min_hire.Orig_Hire AND demo.Ss_No = min_hire.Ss_No MIN(Orig_Hire)不存在,您将获得一些空值Active = 'A',您应该验证这些值。

  • 此外,假设Ss_No没有多行用于相同的Ss_no

答案 1 :(得分:0)

我通过使用PHP解决了这个问题。这是我提出的最简单的方法。

$sql = "SELECT Ss_No, Orig_Hire, Active FROM database_1.demographics
        UNION ALL
        SELECT Ss_No, Orig_Hire, Active FROM database_2.demographics
        ORDER BY 1,3,2 ASC"; /* ORDERBY is important since we are setting the first record*/

$sth = $apex->prepare($sql);
$sth->execute();

$sth->setFetchMode(PDO::FETCH_ASSOC);

$SSN = '';

foreach ($sth as $row) {
    if($row['SSN'] != $SSN) {
        $row['IsPrimaryAssignment'] = 1;
    } else {
        $row['IsPrimaryAssignment'] = 0;
    }
    $SSN = $row['SSN'];
}