SQL子查询混淆:如何在SAME表中引用外部查询列

时间:2015-12-05 21:56:37

标签: 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是否在ValueOne记录的Field2date的2个月内#34;。如果是,则返回Match。如果没有,请返回不匹配。

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

到目前为止,我的研究表明,某些联接可能就是答案:但我不确定在这种情况下如何应用,或者即使它是正确的方法。

上面的代码运行良好,但只能在子查询中指定日期。我需要一种方法来创建日期变量,并链接到相同ID的ValueOne记录中的日期。

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

感谢任何帮助! :)

1 个答案:

答案 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;