+ -
当前位置:首页 → 问答吧 → 高手来看看,这个sql怎么写?很纠结啊!!

高手来看看,这个sql怎么写?很纠结啊!!

时间:2011-11-23

来源:互联网

我有ent(code,level)表,ent表的历史表ent_history(code,level,date)。
每次变更ent表的level字段,会保存到ent_history一条新记录,date字段为操作时间。

现在有个情况是ent表的level字段有些记录的值丢失了。需要从history中恢复level字段的值。

history查询的时候按照date倒序取第一条,将level的值重新赋值给ent表。

比如,ent表中有A、B、C三条记录没有level值,ent_history中有A1、A2、B1、B2四条对应记录。即A和B分别有2条历史,C没有历史。

想要ent_history表里有值的就把最新的历史记录中level值赋值给ent,history表没有的就不管,保持ent里的level无值。


用sql怎么搞啊。。。俩表通过code关联。

拜谢啊

作者: liguivicky   发布时间: 2011-11-23

使用merge into语句吧!

作者: youshang444   发布时间: 2011-11-23

最好列出數據和要的結果

作者: roy_88   发布时间: 2011-11-23

使用纯SQL很难搞定吧。不过可以试试下面的SQL语句:
SQL code

UPDATE ent e SET LEVEL = 
    (SELECT LEVEL FROM ent_history eh  WHERE eh.code = e.code AND eh.date = 
        (SELECT MAX(DATE) FROM ent_history  eh1 WHERE eh1.code = eh.code)
    )
WHERE LEVEL IS NULL;



上面这个语句的执行效率会相当低。

不过用PL/SQL写个存储过程到是很容易搞定。

作者: LuiseRADL   发布时间: 2011-11-23

使用纯SQL很难搞定吧。不过可以试试下面的SQL语句:
SQL code

UPDATE ent e SET LEVEL = 
    (SELECT LEVEL FROM ent_history eh  WHERE eh.code = e.code AND eh.date = 
        (SELECT MAX(DATE) FROM ent_history  eh1 WHERE eh1.code = eh.code)
    )
WHERE LEVEL IS NULL;



上面这个语句的执行效率会相当低。

不过用PL/SQL写个存储过程到是很容易搞定。

作者: LuiseRADL   发布时间: 2011-11-23

SQL code

--his表倒序取第一条
SELECT CODE, LEVEL, DATE
  FROM (SELECT CODE,
               LEVEL,
               DATE,
               ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY DATE DESC) ROW_
          FROM ENT_HISTORY)
 WHERE ROW_ = 1;

--更新ent表数据,最好用merge into
MERGE INTO ENT A
USING (SELECT CODE, LEVEL, DATE
         FROM (SELECT CODE,
                      LEVEL,
                      DATE,
                      ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY DATE DESC) ROW_
                 FROM ENT_HISTORY)
        WHERE ROW_ = 1) B
ON A.CODE = B.CODE AND A.LEVEL IS NULL
WHEN MATCHED THEN
  UPDATE SET A.LEVEL = B.LEVEL;


作者: BenChiM888   发布时间: 2011-11-23

很简单的,历史库查询按日期排个序,取第一条更新就行了。
UPDATE ent e SET level = 
  (SELECT level FROM ent_history eh WHERE eh.code = e.code AND ROWNUM = 1 ORDER BY eh.date DESC )
WHERE level IS NULL;

作者: iamlaosong   发布时间: 2011-11-23

很简单的,历史库查询按日期排个序,取第一条更新就行了。
[code=SQL][/code]UPDATE ent e SET level =  
  (SELECT level FROM ent_history eh WHERE eh.code = e.code AND ROWNUM = 1 ORDER BY eh.date DESC )
WHERE level IS NULL;

作者: iamlaosong   发布时间: 2011-11-23

很简单的,历史库查询按日期排个序,取第一条更新就行了。
SQL code
UPDATE ent e SET level =   
  (SELECT level FROM ent_history eh WHERE eh.code = e.code AND ROWNUM = 1 ORDER BY eh.date DESC )
WHERE level IS NULL;


不好意思,尝试发源代码。

作者: iamlaosong   发布时间: 2011-11-23

热门下载

更多