首页 > 解决方案 > 选择预览查询中不存在的行

问题描述

我有 3 张桌子

1- 迪斯

Oid || Name

2- CS

Oid || Name || Dis

3- 暴击

Oid || CS || Date

我有一个查询,它给出了与当前月份和年份匹配的 Dis 和 CS 的名称:

   SELECT Dis.Oid as 'DisOid', Dis.Name as 'Dis', CS.OID as 'CsOid' ,CS.Name  as 'CS'
     FROM Crit, CS, Dis
    WHERE Crit.CS=CS.OID AND Dis.OID=CS.Dis 
      AND convert(datetime,CONCAT(YEAR(getdate()),'-',Month(getdate()),'-01 00:00:00')) = convert(datetime,CONCAT(YEAR(Crit.Date),'-',Month(Crit.Date),'-01 00:00:00')) 
 ORDER BY Dis.Oid DESC

我需要的是获取先前查询中不存在的 Cs,我做了这个:

   SELECT Dis.Oid as 'DisOid', Dis.Name as 'Dis', CS.OID as 'CsOid' ,CS.Name  as 'CS'
     FROM Crit, CS, Dis
    WHERE NOT EXISTS (SELECT Crit.Oid 
     FROM Crit WHERE Crit.CS=CS.OID) 
      AND Dis.OID=CS.Dis 
      AND convert(datetime,CONCAT(YEAR(getdate()),'-',Month(getdate()),'-01 00:00:00')) = convert(datetime,CONCAT(YEAR(Crit.Date),'-',Month(Crit.Date),'-01 00:00:00')) 
 ORDER BY Dis.Oid DESC

但它不能正常工作,它给了我 CS 副本,我不确定它是否给了我当前月份和年份不存在的 CS。

我怎样才能让它正常工作?我没有完全理解“不存在”,我不知道这是否是我需要的。

标签: sqlsql-server

解决方案


这最终对我有用:

SELECT dis.oid    AS 'DisOid', 
       dis.[name] AS 'Dis', 
       cs.oid     AS 'CsOid', 
       cs.[name]  AS 'CS' 
FROM   cs, 
       dis 
WHERE  dis.oid = cs.dis 
       AND cs.oid NOT IN (SELECT cs.oid 
                          FROM   crit, 
                                 cs, 
                                 dis 
                          WHERE  crit.cs = cs.oid 
                                 AND dis.oid = cs.dis 
                                 AND CONVERT(DATETIME, Concat(Year(Getdate()), 
                                                       '-', 
                                                       Month( 
                                                       Getdate()), 
                                                       '-01 00:00:00') 
                                     ) = CONVERT(DATETIME, Concat( 
                                         Year(crit.date), '-', 
                                                           Month(crit.date), 
                                                           '-01 00:00:00') 
                                         )) 

我不知道这是否是理想的方法,但它可以在合理的时间内完成工作。


推荐阅读