SQL子查询混淆: how to refer to outer query column in the SAME table

标签 sql join subquery business-objects

我对 SQL 还很陌生。我试图通过手动调整 SQL 在 Business Objects 中构建某个查询。我对子查询有一个初学者的理解,但是有一个特殊的问题让我难以理解。我将尝试使用代码示例进行解释:

SELECT
TBL1.ID
TBL1.Field1text
TBL1.Field2date
CASE WHEN
    (
    TBL1.Field1text = 'ValueTwo'
    AND
    TBL1.Field2date >= '30/11/2014'
    /* Arbitrary date. I actually want this to be, for example,
        "TBL1.Field2date minus 2 months where TBL1.ID is the same, and
        TBL1.Field1text is ValueOne" */
    )
THEN 'Match'
ELSE 'No Match'
END
As CutomColumnNameToShowMatches
WHERE
TBL1.Field1text = 'ValueOne'
AND
TBL1.Field2date BETWEEN '01/01/2015' AND '31/12/2015'

如您所见,我在选择条件中使用了 CASE WHEN 子句来返回显示是否匹配的自定义字段(如下所述)。

源表有一堆记录,其中 Field1text 的每个值都与特定日期 (Field2date) 相关联。 “ID”字段不是主键。可以在多个记录中使用相同的 ID。例如,ID 52 可能有多个记录,所有记录都显示不同的 Field1text 值及其关联的 Field2date。到目前为止和我在一起吗?好。

我的基本查询返回一个记录列表,其中 Field1text 是“ValueOne”。这很容易。但是,我接下来要做的是确定 - 对于这些记录中的每一个:

“取身份证号,查表,同一个ID是否也有Field1text等于ValueTwo的记录,并且ValueTwo记录的Field2date在2个月内的Field2date ValueOne 记录”。如果是,则返回 Match。如果不是,则不返回匹配项。

这一切有意义吗?如果需要,请让我澄清。

到目前为止,我的研究表明某种 JOIN 可能是答案:但是我不确定这将如何应用于这种情况,甚至不确定它是否是正确的方法。

上面的代码工作得很好,但只适用于子查询中的指定日期。我需要一种方法使该日期可变,并链接到同一 ID 的 ValueOne 记录中的日期。

请注意,我们在同一张 table 上工作。此外,由于我在 Business Objects 中工作,所以我无法像在 MS Access 中那样创建和保存命名查询。一切都必须从一段 SQL 代码开始。

感谢您的帮助! :)

最佳答案

为同一个表分配不同的别名,并将两个别名连接在一起。使用您的示例,我创建了一个查询,该查询仅显示在时间范围内具有匹配项的行。它使用别名“a”和“b”,如下所示:

SELECT
    a.ID,
    a.Field1text,
    a.Field2date
FROM
    TBL1 AS a
    INNER JOIN TBL1 AS b ON 
        a.ID = b.ID 
        AND a.Field1text = b.Field1text
        AND b.Field2date > a.Field2date 
        AND b.Field2date <= DATEADD(month, 2, a.Field2date )

或者,如果您想要“a”中的所有行,并且只是在“b”中找到匹配项的指示器,那么试试这个:

SELECT
    a.ID,
    a.Field1text,
    a.Field2date,
    CASE 
        WHEN 
            (
                SELECT TOP 1 
                    CASE WHEN b.ID IS NULL THEN 'No Match' ELSE 'Match' END
                FROM 
                    TBL1 AS b
                WHERE
                    a.ID = b.ID 
                    AND a.Field1text = b.Field1text
                    AND b.Field2date > a.Field2date 
                    AND b.Field2date <= DATEADD(month, 2, a.Field2date )
            ) IS NULL 
        THEN 'No Match' 
        ELSE 'Match' 
    END AS [MatchSearch]
FROM
    TBL1 AS a
WHERE
    a.Field1text = 'ValueOne'
    AND a.Field2date BETWEEN '01/01/2015' AND '12/31/2015'

注意:这仍将显示“b”中与外部 WHERE 子句匹配的行。如果您不想显示它们,请考虑添加 GROUP BY 子句。

PS:我找不到您查询的 FROM 部分,所以我做了一个。 此外,您的日期范围文本格式不正确:'31/12/2015'

关于SQL子查询混淆: how to refer to outer query column in the SAME table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111384/

相关文章:

mysql - 删除带左连接的数据表

php - 更大、更少或者更小、更多的查询?

MongoDB 并将 DBRef 与空间数据一起使用

arrays - Powershell连接路径返回数组

mysql - 使用半正矢公式与 MySQL 的两个坐标表最接近的匹配

mysql - 子查询到LIKE条件mysql

mysql - 查找 "old"行

sql - 从 SQL Server 2005 中的日期时间获取月份和年份

mysql - SQL:选择对话 GROUP BY 与另一个表中的最后一条记录

php - 升级 MySQL 5.0 Linux -> MySQL 5.1 Windows,现在查询不起作用