【问题标题】:SQL query with multiple values iteration like for each具有多个值迭代的 SQL 查询,例如每个
【发布时间】:2013-08-20 18:48:20
【问题描述】:

表格:detail1

LN_ID       LN_DATE   LN_CATG
----------  --------  -------
1693834961  8/1/2013        16
1693834961  7/1/2013        16
1693834961  6/1/2013         4
1693834961  5/1/2013        16
1693834962  8/1/2013        16
1693834962  7/1/2013        16
1693834962  6/1/2013        16
1693834962  5/1/2013         5

表格:detail2

LN_ID       LN_MOD_DATE  LN_PYMT_DATE
----------  -----------  ------------
1693834961  8/1/2012     1/1/2011
1693834961  9/1/2011     2/1/2011
1693834962  10/1/2012    3/1/2012

结果:

LN_ID      FIRST_DT  LAST_DT   LN_MOD_DT  LN_PYMT_DT
---------- --------  --------  ---------  ----------
1693834961 8/1/2013  6/1/2013  8/1/2012    1/1/2011

查询:

SELECT ln_id, first_dt, last_dt, ln_mod_dt, ln_pymt_dt  FROM 
(SELECT   a.ln_id ln_id, a.ln_date first_dt, 
                 b.ln_date last_dt, c.ln_mod_date ln_mod_dt,
                 c.ln_pymt_date ln_pymt_dt
            FROM detail1 a,
                 (SELECT *
                    FROM (SELECT   *
                              FROM detail1
                             WHERE ln_id = '1693834961'
                               AND ln_catg <> 16
                          ORDER BY ln_date DESC)
                   WHERE ROWNUM < 2) b,
                 (SELECT *
                    FROM (SELECT   *
                              FROM detail2
                             WHERE ln_id  = '1693834961'
                          ORDER BY ln_mod_date DESC)
                   WHERE ROWNUM < 2) c
           WHERE a.ln_id = b.ln_id
             AND a.ln_id = c.ln_id
             AND a.ln_catg = 16
        ORDER BY a.ln_date DESC)
 WHERE ROWNUM < 2

我需要从每个 LN_ID 的 detail1 表中连续找到 ln_catg = 16 的第一个(最新)和最后一个日期。

例如,预期的输出为,

   LN_ID      FIRST_DT  LAST_DT   LN_MOD_DT  LN_PYMT_DT
    ---------- --------  --------  ---------  ----------
    1693834961 8/1/2013  7/1/2013  8/1/2012    1/1/2011
    1693834962 8/1/2013  6/1/2013  8/1/2012    1/1/2012
    --------

当查询一次针对一个 ln_id 执行时,这似乎很有效,但我们的期望是这种相同类型的查询一次应该针对多个 id 执行。

是否可以添加一种 for-each 或添加任何其他 where 或 IN Condtion 以传递不同的 iD?因为子查询中的 ln_id 硬代码不确定我如何使用一个和另一个并执行..

如有任何帮助,将不胜感激。

【问题讨论】:

  • 这个表 2 mod_date 是如何被获取的。我的意思是要画哪一行,取决于什么条件。如果表 1 中只有一条记录,那么第一个和最后日期
  • 两个表都与 ln_id 结合。如果 detail2 表中有多个记录,我应该从中选择最新记录。如果第一个表中只有 1 条记录,它将返回 null 或相同的记录..

标签: sql database oracle join


【解决方案1】:

我觉得这样可以吗?

SELECT 
    D1.LN_ID, 
    MAX(D1.LN_DATE) AS FIRST_DT, 
    MAX(D1_A.LN_DATE) AS LAST_DT, 
    MAX(D2.LN_MOD_DATE) AS LN_MOD_DT, 
    MAX(D2.LN_PYMT_DATE) AS LN_PYMT_DT  
FROM 
    DETAIL1 D1
    INNER JOIN DETAIL2 D2 ON D1.LN_ID=D2.LN_ID
    INNER JOIN DETAIL1 D1_A ON D1_A.LN_ID=D1.LN_ID
WHERE 
    D1.LN_CATG = 16 
    AND D1_A.LN_CATG = 16 
    AND D1_A.LN_DATE < D1.LN_DATE
GROUP BY 
    D1.LN_ID

【讨论】:

  • 感谢 Jymbo。只需要进行一次更正,因为当 detail2 表有多个 ln_id 记录时,我应该只选择最新的 (max(ln_mod_date)) 记录。但现在它返回了两个记录。我确实尝试过,但似乎它总是返回两个..
  • 你能给我一个从你的数据中返回的示例数据集吗?我使用了您在问题中发布的数据集,但 1693834961 和 1693834962 仅获得 1 条记录
  • 我确实更新了 Table: detail2 数据集,如果日期不同,它会拉取 ln_Id 的两个记录。相反,它应该取任意数量之间具有最大 D2.LN_MOD_DATE 记录的记录该特定贷款 ID 的 detail2 表中的记录。感谢您的大力帮助。
  • @user2309604,我根据您的新数据更改了查询。我相信这应该会让你得到你想要的。
  • @user2309604,np 人。请记住,此查询具有所有内部联接。如果特定 LN_ID 的 detail1 中只有一条记录,或者 detail2 中没有关联记录,则此查询不会返回记录。因此,如果出现这种情况,您可以考虑将它们更改为左连接。
猜你喜欢
  • 2011-05-29
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2015-01-22
  • 2021-06-13
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多