sql - 选择预览查询中不存在的行
问题描述
我有 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。
我怎样才能让它正常工作?我没有完全理解“不存在”,我不知道这是否是我需要的。
解决方案
这最终对我有用:
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')
))
我不知道这是否是理想的方法,但它可以在合理的时间内完成工作。