选择预览查询中不存在的行

时间:2018-06-25 18:33:48

标签: sql sql-server

我有3张桌子

1- Dis

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的信息。

如何使其正常工作?我还没有完全了解'NOT EXISTS',我不知道那是否是我所需要的。

2 个答案:

答案 0 :(得分:0)

需要将不存在更改为不存在的声音:

SELECT distinct Dis.Oid as 'DisOid', Dis.Name as 'Dis', CS.OID as 'CsOid' ,CS.Name  as 'CS'
FROM Crit, CS, Dis
WHERE cs.name not in (select rest of query)

我无法复制其余子查询。

答案 1 :(得分:0)

这终于对我有用:

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') 
                                         )) 

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