如何从一个表中查找多个列满足不同条件的记录?

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.EndDatenull,那么我们使用不同的日期列进行比较。 将满足此条件的来自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 1OR

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

【讨论】:

以上是关于如何从一个表中查找多个列满足不同条件的记录?的主要内容,如果未能解决你的问题,请参考以下文章

3.05 在一个表中查找与其他表不匹配的记录

您如何比较多个表中的记录但查找不同或缺失的值

如果使用 where 条件更改了列的数据类型,如何查找列的记录

单个查询从具有不同列的多个表中获取记录

CSV文件操作,PHP如何对满足条件的二维数组进行求和

sql语句查询,根据一个表中一个列,该列在两个不同条件同时满足的查询结果