如何从一个表中查找多个列满足不同条件的记录?
Posted
技术标签:
【中文标题】如何从一个表中查找多个列满足不同条件的记录?【英文标题】:How to find records from one table where multiple columns meet different criteria? 【发布时间】:2016-08-10 14:08:16 【问题描述】:我使用的是 MS SQL Server 2012。
我正在尝试创建一个以@n int
作为参数的存储过程。该过程基本上是尝试根据记录的日期早于另一个表中的某些日期,从一个表中查找需要重新计算某些信息的记录子集。
该程序必须执行以下操作:
从Table1
中查找记录,其中Table1.UpdatedOn
是过去@n
天之内的记录。
从Table2
中查找记录,其中Table2.EndDate
是在第一个项目符号点返回的记录中的日期(所以基本上如果T2.EndDate
T1SubSet.UpdatedOn,那么我们想要那个记录)
如果 Table2.EndDate
是 null
,那么我们使用不同的日期列进行比较。
将满足此条件的来自Table2
的记录插入Table3
。更具体地说,它应该将Table2.RecordID
以及一些“硬编码”值插入到Table3
中。
这就是我所拥有的:
INSERT INTO Table3 (ColA, ColB, ColC, ColD)
SELECT RecordID, GETDATE(), 0, null
FROM Table2
WHERE EXISTS
(SELECT RecordID FROM Table2 WHERE EndDate IS NOT NULL AND EndDate < (SELECT UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE())) OR
SELECT RecordID FROM Table2 WHERE EndDate IS NULL And SomeOtherDate < (SELECT UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE())))
从逻辑上讲,这可能是不正确的,但是当我尝试执行该命令时,无论哪种方式,我都会收到两个错误:
第 21 行 关键字“SELECT”附近的语法不正确。
第 21 行 ')' 附近的语法不正确。
我不确定我的嵌套查询出了什么问题。
【问题讨论】:
匹配 ('s 和 )'s。 问题出现在 OR 之后。 对于您的未使用的日期,如果它为空,那么您的搜索参数可以是 COALESCE(EndDate , SomeOtherDate ) 如果还不行,我们仍然可以做更多,您已经得到“从 Table1 中查找 Table1.UpdatedOn 在过去 @n 天内的记录。”没关系,但是在第二点“在第一个项目符号点返回的记录中的日期之前”,项目符号点 1 是否给出了多个日期?如果是,我们使用哪个日期,所以记录配对,或者我们会采取一些最小的集合 - 如果你问另一个问题,试着举一个只有几条记录的例子,即使是第一组中的两条记录你回来,然后解释日期是如何工作的 【参考方案1】:使用TOP 1
和OR
INSERT INTO Table3 (ColA, ColB, ColC, ColD)
SELECT RecordID, GETDATE(), 0, null
FROM Table2
WHERE EXISTS
(
SELECT RecordID FROM Table2
WHERE
(
EndDate IS NOT NULL AND
EndDate < (SELECT TOP 1 UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE()))
) OR
(
EndDate IS NULL And
SomeOtherDate < (SELECT TOP 1 UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE()))
)
)
【讨论】:
谢谢!这不会爆炸,尽管我需要在它获得我想要的记录之前修复逻辑。接受作为答案,因为它解决了“什么是语法错误?”的问题【参考方案2】:为此使用 COALESCE。它获取列表中不为空的第一个参数。它是 ISO 标准,非常有用
INSERT INTO Table3 (ColA, ColB, ColC, ColD)
SELECT RecordID, GETDATE(), 0, null
FROM Table2
WHERE EXISTS
(SELECT RecordID FROM Table2 WHERE
COALESCE(EndDate, SomeOtherDate)
< (SELECT UpdatedOn FROM Table1
WHERE UpdatedOn > DATEADD(day, @n, GETDATE()))
【讨论】:
以上是关于如何从一个表中查找多个列满足不同条件的记录?的主要内容,如果未能解决你的问题,请参考以下文章