Sql 当第一个表中的一条记录链接到第二个表中的多条记录时,有选择地从表中检索数据

Sql 当第一个表中的一条记录链接到第二个表中的多条记录时,有选择地从表中检索数据,sql,oracle,plsql,Sql,Oracle,Plsql,我有两张桌子: 1. Tbl_Master: columns: a. SEQ_id b. M_Email_id c. M_location_id d. Del_flag 2. Tbl_User: columns a. U_email_id b. Last_logged_date c. User_id 第一个表是主表,它有唯一的行,即系统中所有用户的单个记录。 每个用户都可以通过每个表中的电子邮件id进行唯一标识 一个用

我有两张桌子:

1.  Tbl_Master: columns:
     a. SEQ_id
     b. M_Email_id
     c. M_location_id
     d. Del_flag

2.  Tbl_User: columns
     a. U_email_id
     b. Last_logged_date
     c. User_id
第一个表是主表,它有唯一的行,即系统中所有用户的单个记录。 每个用户都可以通过每个表中的电子邮件id进行唯一标识

一个用户可以有多个配置文件,这意味着对于tblUser表中的一个us_email_id字段,tbl_user中可能有多个user_id, i、 e对于每个用户,第二个表中可以有多个条目

现在,我必须只选择那些在2012年1月1日之前最后一次登录的用户

但如果一个用户有2个或多个用户id,且一个用户id的上次登录日期小于2012年 但其他用户的id大于2012,则应忽略该用户

最后,通过将主表中的DEL_标志设置为“是”,所有结果用户都将被标记为删除 例如:


在这种情况下,只应选择John的记录,而不是某个配置文件最后一次记录在2012年1月1日的Ram。试试这个,这个ans在sql server中,我没有在Oracle上工作过

select * from Tbl_Master 
outer apply
(
    select U_email_id,max(Last_logged_date)as LLogged,count(U_email_id) as RecCount 
    from Tbl_User 
    where Tbl_User.U_email_id = Tbl_Master.M_Email_id
     group by U_email_id

)as a
where RecCount >2
and Year(LLogged) < '2012'
试试这个


希望它能帮助您。

试试这个,这个ans在sql server中,我还没有在Oracle上工作过

select * from Tbl_Master 
outer apply
(
    select U_email_id,max(Last_logged_date)as LLogged,count(U_email_id) as RecCount 
    from Tbl_User 
    where Tbl_User.U_email_id = Tbl_Master.M_Email_id
     group by U_email_id

)as a
where RecCount >2
and Year(LLogged) < '2012'
试试这个


希望它能帮助你。

另一种可能性是

SELECT
    m.M_Email_id,
    MAX(u.Last_logged_date) AS last_login
FROM
    Tbl_Master m
INNER JOIN
    Tbl_User u on u.U_email_id = m.M_Email_id
GROUP BY m.M_Email_id
HAVING
    -- Year(MAX(u.Last_logged_date)) < 2012   -- use the appropriate function of your DBMS
    EXTRACT(YEAR FROM(MAX(u.Last_logged_date))) < 2012 -- should be the version for oracle
 -- see http://docs.oracle.com/cd/B14117_01/server.101/b10759/functions045.htm#i1017161

更新操作可以在WHERE子句中使用此select。

另一种可能性是

SELECT
    m.M_Email_id,
    MAX(u.Last_logged_date) AS last_login
FROM
    Tbl_Master m
INNER JOIN
    Tbl_User u on u.U_email_id = m.M_Email_id
GROUP BY m.M_Email_id
HAVING
    -- Year(MAX(u.Last_logged_date)) < 2012   -- use the appropriate function of your DBMS
    EXTRACT(YEAR FROM(MAX(u.Last_logged_date))) < 2012 -- should be the version for oracle
 -- see http://docs.oracle.com/cd/B14117_01/server.101/b10759/functions045.htm#i1017161


您的更新操作可以在WHERE子句中使用此select。

感谢您的编辑,我在匆忙中发布了此内容,这就是为什么编辑不好的原因!你能发布一些示例数据吗?@G One:完成了,谢谢你的编辑,我在匆忙中发布了这篇文章,这就是为什么编辑不好的原因!你能发布一些示例数据吗?@G One:done chk OUT我正在SQL Developer上工作,让我检查一下它在其中是否工作正常。你正在使用哪个DBMS?Oracle/MS SQL/MYSQL?如果有效,请告诉我。删除同一用户是一项简单的任务写入删除srcipt&在Where子句中写入M_Email_id in…My Ans…[使用select M_Email_d from]服务器上有Oracle 11g。实际上没有必要删除该用户。我们可以把他们的国旗栏设置为Yeswell我可以在一段时间后更改!一旦我检查了它,我肯定会让你知道我在SQL Developer上工作,让我检查一下它在里面是否工作正常。你使用的是哪种DBMS?Oracle/MS SQL/MYSQL?如果有效,请告诉我。删除同一用户是一项简单的任务写入删除srcipt&在Where子句中写入M_Email_id in…My Ans…[使用select M_Email_d from]服务器上有Oracle 11g。实际上没有必要删除该用户。我们可以把他们的国旗栏设置为Yeswell我可以在一段时间后更改!我查过之后一定会告诉你的汉克斯,我试试这个!检查后会让您知道尝试此:我在最后一行中出错:ORA-00904:年份:无效标识更改为:YearMAXu.last_logged_date<2012到MAXu.last_logged_date<'01-Jan-2012'谢谢,我会尝试!检查完毕后会让您知道:我在最后一行中出错:ORA-00904:YEAR:无效标识更改为:YearMAXu.last_logged_date<2012到MAXu.last_logged_date<'01-Jan-2012'