0

次のステートメントが返す行だけを削除したいのですが、どうすればよいですか?

  select usersernum,username,useremail 
    from core.appuser
   where usersernum in (
              select ch.usersernum
                from core.appusersession ch
               where ch.usersernum not in (
                          select usersernum
                            from (
                                       select max(starttime) as maxstarttime
                                            , usersernum
                                         from core.appusersession  vip
                                        where vip.starttime >= '2011-01-01 00:00:00'
                                     group by usersernum
                                 )
                     )
            group by usersernum
         )
order by useremail
       ;
4

3 に答える 3

1

あなたが使用することができます

DELETE  FROM core.appuser WHERE usersnum IN (
     select  usersernum 
       from  core.appuser
      where  usersernum in (
             select  ch.usersernum
               from  core.appusersession ch
              where  ch.usersernum not in (
                 select  usersernum from (
                     select  max(starttime) as maxstarttime, usersernum
                       from  core.appusersession  vip where vip.starttime>='2011-01-01 00:00:00' group by usersernum))
          group by  usersernum)
    order by  useremail);
于 2013-08-08T23:44:15.353 に答える
0

Sometimes it helps to take a step back and ask yourself, What is the real goal here, in "business terms" or every-day language rather than SQL.

Your query looks like it has a bunch of unnecessary layers. It appears that what you really want to do is remove any inactive users, meaning those who have not started a session since the beginning of 2011.

DELETE  FROM core.appuser 
  WHERE usersernum NOT IN 
    ( SELECT DISTINCT usersernum
        FROM core.appusersession  
        WHERE starttime>='2011-01-01 00:00:00'
    );

Isn't that much simpler?

于 2013-08-09T22:51:01.087 に答える
0

実行している DB2 のプラットフォームやバージョンはわかりませんが、DB2 9.7 for Linux, UNIX and Windows 以降を使用している場合は、非常に便利な「delete from select」を使用できます。

delete from (
  select usersernum,username,useremail 
    from core.appuser
   where usersernum in (
              select ch.usersernum
                from core.appusersession ch
               where ch.usersernum not in (
                          select usersernum
                            from (
                                       select max(starttime) as maxstarttime
                                            , usersernum
                                         from core.appusersession  vip
                                        where vip.starttime >= '2011-01-01 00:00:00'
                                     group by usersernum
                                 )
                     )
            group by usersernum
         )
    order by useremail
);
于 2013-08-09T06:29:08.850 に答える