我对 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/