SQL 子查询混淆:如何引用 SAME 中的外部查询列 table
SQL subquery confusion: how to refer to outer query column in the SAME table
我是 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 子句 return 显示是否匹配的自定义字段(如下所述)。
来源 table 有一堆记录,其中 Field1text 的每个值都与特定日期 (Field2date) 相关联。 "ID" 字段不是主键。可以在多个记录中使用相同的 ID。例如,ID 52 可能有多个记录,所有记录都显示不同的 Field1text 值及其关联的 Field2date。到目前为止和我在一起吗?好
我的基本查询 return 是一个记录列表,其中 Field1text 是 "ValueOne"。这很容易。但是,我接下来要做的是确定 - 对于每条记录:
"Take the ID number. Search the table, and find whether that same ID ALSO has any records where Field1text equals ValueTwo, and where the Field2date of that ValueTwo record is within 2 months of the Field2date of the ValueOne record"。如果是,则 return 匹配。如果不是,return 不匹配。
这一切都有意义吗?如果需要,请让我澄清。
到目前为止,我的研究表明某种 JOIN 可能是答案:但是我不确定在这种情况下如何应用,或者即使它是否是正确的方法。
上面的代码工作得很好,但只适用于子查询中的指定日期。我需要一种方法使该日期可变,并链接到相同 ID 的 ValueOne 记录中的日期。
请注意,我们都在同一个 table 中工作。此外,由于我在 Business Objects 中工作,所以我无法像在 MS Access 中那样创建和保存命名查询。一切都必须从一段 SQL 代码开始。
感谢您的帮助! :)
将不同的别名分配给同一个 table 并将两个别名连接在一起。使用您的示例,我创建了一个查询,该查询仅显示在时间范围内具有匹配项的行。它使用别名 '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 的新手。我试图通过手动调整 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 子句 return 显示是否匹配的自定义字段(如下所述)。
来源 table 有一堆记录,其中 Field1text 的每个值都与特定日期 (Field2date) 相关联。 "ID" 字段不是主键。可以在多个记录中使用相同的 ID。例如,ID 52 可能有多个记录,所有记录都显示不同的 Field1text 值及其关联的 Field2date。到目前为止和我在一起吗?好
我的基本查询 return 是一个记录列表,其中 Field1text 是 "ValueOne"。这很容易。但是,我接下来要做的是确定 - 对于每条记录:
"Take the ID number. Search the table, and find whether that same ID ALSO has any records where Field1text equals ValueTwo, and where the Field2date of that ValueTwo record is within 2 months of the Field2date of the ValueOne record"。如果是,则 return 匹配。如果不是,return 不匹配。
这一切都有意义吗?如果需要,请让我澄清。
到目前为止,我的研究表明某种 JOIN 可能是答案:但是我不确定在这种情况下如何应用,或者即使它是否是正确的方法。
上面的代码工作得很好,但只适用于子查询中的指定日期。我需要一种方法使该日期可变,并链接到相同 ID 的 ValueOne 记录中的日期。
请注意,我们都在同一个 table 中工作。此外,由于我在 Business Objects 中工作,所以我无法像在 MS Access 中那样创建和保存命名查询。一切都必须从一段 SQL 代码开始。
感谢您的帮助! :)
将不同的别名分配给同一个 table 并将两个别名连接在一起。使用您的示例,我创建了一个查询,该查询仅显示在时间范围内具有匹配项的行。它使用别名 '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'