Sql --------------------------- |1 |用户1 | 2021-01-28 |车牌1 | 2020-12-07 | 2020-12-08 | |1 |用户1 | 2021-01-28 |板2 | | 2021-01-01 |

Sql --------------------------- |1 |用户1 | 2021-01-28 |车牌1 | 2020-12-07 | 2020-12-08 | |1 |用户1 | 2021-01-28 |板2 | | 2021-01-01 |,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在构建的这个系统将显示在查询日期之前过期的文档 这个查询是一个更大的查询的一部分,但是我被这个部分卡住了,在我的项目开始时,用户只能注册一辆车,但是现在我正在更改项目以接受任意数量的车 查询返回的是重复的数据,我被这段代码困住了 我编辑了原来的问题,使之更容易理解,我是一个新的编码,所以,需要学习很多,对不起,如果是一个简单的问题,但对我来说不是 代码中日期为1900-01-01的部分是因为当用户在系统上添加数据时,它是默认数据,因此我需要从结果中排除默认数据 谢谢你一直以来帮助我 编辑添

我正在构建的这个系统将显示在查询日期之前过期的文档

这个查询是一个更大的查询的一部分,但是我被这个部分卡住了,在我的项目开始时,用户只能注册一辆车,但是现在我正在更改项目以接受任意数量的车

查询返回的是重复的数据,我被这段代码困住了

我编辑了原来的问题,使之更容易理解,我是一个新的编码,所以,需要学习很多,对不起,如果是一个简单的问题,但对我来说不是

代码中日期为1900-01-01的部分是因为当用户在系统上添加数据时,它是默认数据,因此我需要从结果中排除默认数据

谢谢你一直以来帮助我


编辑添加的sql数据 分贝

创建数据库[Teste]
去
使用测试仪
去
创建表格MUser(
MUser_ID int IDENTITY(1,1)不为空,
博物馆用户编号nvarchar(10)不为空,
MUser\u用户名nvarchar(50)不为空,
约束主键MUser用户号主键(MUser用户号),
);
插入MUser(
博物馆用户编号
,MUser\u用户名
) 
价值观(
N'1'
,N'User1'
)
创建表MCar(
MCar_ID整数标识(1,1)不为空,
MCar_用户_编号nvarchar(10)不为空,
MCar_板nvarchar(50)不为空,
MCar\u SHAKEN\u到期日期为空,
MCar_JIBAISEKI_到期日期为空,
MCar\u保险到期日期为空,
约束PK_MCar_板主键(MCar_板),
约束FK\ U MCar\ U USER\ U NUMBER外键(MCar\ U USER\ U NUMBER)引用MUser(MUser\ U USER\ U NUMBER)
);
插入MCar(
MCar_用户_编号
,MCar_板
,MCar_SHAKEN_过期日期
,MCar_JIBAISEKI_到期日
,MCar\u保险\u到期\u日期
) 
价值观(
N'1'
,N'Plate1'
,N'2020-12-07'
,N'2020-12-08'
,N'2021-07-01'
)
插入MCar(
MCar_用户_编号
,MCar_板
,MCar_SHAKEN_过期日期
,MCar_JIBAISEKI_到期日
,MCar\u保险\u到期\u日期
) 
价值观(
N'1'
,N'Plate 2'
,N'2021-03-01'
,N'2021-03-02'
,N'2021-01-01'
)
创建表Mpassport(
Mpassport_ID int IDENTITY(1,1)不为空,
Mpassport\u用户号nvarchar(10)不为空,
Mpassport_编号nvarchar(50)空,
Mpassport\u到期日期为空,
约束主键Mpassport用户号主键(Mpassport用户号),
约束FK\U Mpassport\U USER\U NUMBER外键(Mpassport\U USER\U NUMBER)引用MUser(MUser\U USER\U NUMBER)
);
插入Mpassport(
Mpassport\u用户号
,Mpassport_编号
,Mpassport\u到期日期
) 
价值观(
N'1'
,N'12345678'
,N'2021-01-28'
)
创建表MDrive(
MDrive_ID int IDENTITY(1,1)不为空,
MDrive_USER_NUMBER nvarchar(10)不为空,
MDrive_编号nvarchar(50)空,
MDrive_EXPIRE_DATE空,
约束PK_MDrive_USER_NUMBER主键(MDrive_USER_NUMBER),
约束FK_MDrive_USER_NUMBER外键(MDrive_USER_NUMBER)引用MUser(MUser_USER_NUMBER)
);
插入MDrive(
MDrive\u用户\u编号
,MDrive_编号
,MDrive_EXPIRE_日期
) 
价值观(
N'1'
,N'12345678'
,N'2022-10-28'
)

编辑添加的有关系统的信息 该系统将如下所示: ※仅为系统的一部分

用户注册文档的过期数据

MDrive\u EXPIRE\u DATE=驾驶执照

MCar\u SHAKEN\u EXPIRE\u DATE=车辆文档

MCar_JIBAISEKI_到期日=强制汽车保险

MCar\u保险\u到期\u日期=汽车第三方保险

除此之外还有其他文件,我只是把这个放在这里,这样不会太长

在驾照部分只有一个,但在汽车部分,用户可以有多个

我试图做的是登录到系统来激活此代码,该代码将查看从今天到文档的特定日期之间过期的文档,在这个示例中,我提前了大约3个月

在car部分,可能会发生一个数据未被插补的情况,因为这将是办公室的控制权,并且员工尚未交付文档,因此我将该条款设置为>1900-01-01,因为DB中的默认日期为该日期。 让系统忽略那些没有正确数据的车辆


日期我看不出子查询用于什么。看起来您只需要加入一个

select u.u.muser_user_number, m.muser_user_name, c.mcar_shaken_expire_date
from mcar c
inner join muser u on u.muser_user_number = c.mcar_user_number
我不清楚当汽车在1900年到期时,你想要什么样的行为。如果要过滤掉这些行,只需在查询中添加一个
where
子句:

where c.mcar_shaken_expire_date > '19000101'

如果我按照编辑中的逻辑进行操作,则您需要具有最小抖动日期的行:

select . . .  -- whatever columns you want
from muser u join
     (select c.*,
             min(MCar_SHAKEN_EXPIRE_DATE) as min_MCar_SHAKEN_EXPIRE_DATE
      from mcar c
     ) c
     on u.muser_user_number = c.muser_user_number
where date = min_MCar_SHAKEN_EXPIRE_DATE;
使用select Distinct 并在选择列表中包括MCar_板

    SELECT DISTINCT  MUser.MUser_USER_NUMBER As MUser_USER_NUMBER  
                   , MUser.MUser_USER_NAME AS MUser_USER_NAME
                   , MCar.MCar_PLATE   
                   , MCar_SHAKEN_EXPIRE_DATE
FROM MCar      
LEFT JOIN MUser On  MUser_USER_NUMBER = MCar.MCar_USER_NUMBER     
WHERE MCar.MCar_SHAKEN_EXPIRE_DATE between '1900/01/01' AND '2021/02/16'
。。。我只想展示那些从一个日期到另一个日期过期的汽车,而不是所有列出的汽车

试一试

——code#1
选择C.MCar\U板,C.MCar\U振动\U过期日期,
U.MUser\U用户名、U.MUser\U用户名
从MCar到C
内部连接缪斯为U
-- code #1
SELECT C.MCar_PLATE, C.MCar_SHAKEN_EXPIRE_DATE, 
       U.MUser_USER_NUMBER, U.MUser_USER_NAME
  from MCar as C
       inner join MUser as U on U.MUser_USER_NUMBER = C.MCar_USER_NUMBER
  where C.MCar_SHAKEN_EXPIRE_DATE < '20210216'  
        and C.MCar_SHAKEN_EXPIRE_DATE > '19000101';
SELECT 
  MUser.MUser_USER_NUMBER,
  MUser.MUser_USER_NAME,    
  Mpassport.Mpassport_EXPIRE_DATE,
  MCar.MCar_PLATE,
  CASE WHEN 
    MCar.MCar_SHAKEN_EXPIRE_DATE < '2021/02/16' AND 
    MCar.MCar_SHAKEN_EXPIRE_DATE > '1900/01/01'            
      THEN MCar.MCar_SHAKEN_EXPIRE_DATE 
  END As MCar_SHAKEN_EXPIRE_DATE,
  CASE WHEN
    MCar.MCar_JIBAISEKI_EXPIRE_DATE < '2021/02/16' AND
    MCar.MCar_JIBAISEKI_EXPIRE_DATE > '1900/01/01'
      THEN MCar.MCar_JIBAISEKI_EXPIRE_DATE
  END As MCar_JIBAISEKI_EXPIRE_DATE,
  CASE WHEN 
    MCar.MCar_INSURANCE_EXPIRE_DATE < '2021/02/16' AND
    MCar.MCar_INSURANCE_EXPIRE_DATE > '1900/01/01'
      THEN MCar.MCar_INSURANCE_EXPIRE_DATE
  END As MCar_INSURANCE_EXPIRE_DATE   
FROM MUser    
LEFT JOIN MPassport 
  On 
    MPassport.Mpassport_USER_NUMBER = MUser.MUser_USER_NUMBER AND
    MPassport.Mpassport_EXPIRE_DATE < '2021/02/16' AND 
    MPassport.Mpassport_EXPIRE_DATE > '1900/01/01'    
LEFT JOIN MDrive 
  On
    MDrive.MDrive_USER_NUMBER = MUser_USER_NUMBER AND
    MDrive.MDrive_EXPIRE_DATE < '2021/02/16' AND
    MDrive.MDrive_EXPIRE_DATE > '1900/01/01'
LEFT JOIN MCar 
  On
    MCar.MCar_USER_NUMBER = MUser_USER_NUMBER AND
    ( (MCar_SHAKEN_EXPIRE_DATE < '2021/02/16' AND
       MCar_SHAKEN_EXPIRE_DATE > '1900/01/01') 
     OR
      (MCar_JIBAISEKI_EXPIRE_DATE < '2021/02/16' AND
       MCar_JIBAISEKI_EXPIRE_DATE > '1900/01/01') 
     OR
      (MCar_INSURANCE_EXPIRE_DATE < '2021/02/16' AND 
       MCar_INSURANCE_EXPIRE_DATE > '1900/01/01') )
WHERE
  Mpassport_EXPIRE_DATE IS NOT NULL OR
  MDrive_EXPIRE_DATE IS NOT NULL OR
  MCar_SHAKEN_EXPIRE_DATE IS NOT NULL OR
  MCar_JIBAISEKI_EXPIRE_DATE IS NOT NULL OR
  MCar_INSURANCE_EXPIRE_DATE IS NOT NULL