我对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是否在ValueOne记录的Field2date的2个月内#34;。如果是,则返回Match。如果没有,请返回不匹配。
这一切都有意义吗?如果需要,请让我澄清。
到目前为止,我的研究表明,某些联接可能就是答案:但我不确定在这种情况下如何应用,或者即使它是正确的方法。
上面的代码运行良好,但只能在子查询中指定日期。我需要一种方法来创建日期变量,并链接到相同ID的ValueOne记录中的日期。
请注意,我们在同一张桌子上工作。此外,由于我在Business Objects中工作,我无法像在MS Access中那样创建和保存命名查询。一切都必须使用一段SQL代码。
感谢任何帮助! :)
答案 0 :(得分:2)
将不同的别名分配给同一个表并将两个别名连接在一起。使用您的示例,我创建了一个查询,该查询仅显示在时间范围内匹配的行。它使用别名' 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 )
或者,如果您想要来自&#39; a&#39;并且只是在&#39; b&#39;中找到匹配的指示符然后试试这个:
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'
注意:这仍然会显示来自&#39; b&#39;的行。与外部WHERE子句匹配。如果您不想显示它们,请考虑添加GROUP BY子句。
PS:我无法找到您查询的FROM部分,所以我做了一个。 此外,您的日期范围文字格式不正确:&#39; 31/12 / 2015&#39;