如何在SQL表中循环并找到符合IF条件的行?

如何在SQL表中循环并找到符合IF条件的行?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我想做的。假设我有一张X表上的顾客,他们进入了迪斯尼乐园这样的游乐园。这个客户表非常详细,包括姓名、年龄、种族、收入水平、他们来自的邮政编码以及他们进入公园的时间戳 对于表X中的每一行,我想查询另一个客户信息表Y,以识别与所讨论行具有相同特征的所有其他客户,以及在较早时间点进入迪士尼乐园的客户 例如,在表X中,我看到的乔是一个49岁的德克萨斯人,他在2013年6月10日参观了迪斯尼乐园,挣了70000美元。当我的圈在乔的那一排时,我想在表Y中搜索来自德克萨斯州的所有49岁男性,他们也挣700

这是我想做的。假设我有一张X表上的顾客,他们进入了迪斯尼乐园这样的游乐园。这个客户表非常详细,包括姓名、年龄、种族、收入水平、他们来自的邮政编码以及他们进入公园的时间戳

对于表X中的每一行,我想查询另一个客户信息表Y,以识别与所讨论行具有相同特征的所有其他客户,以及在较早时间点进入迪士尼乐园的客户

例如,在表X中,我看到的乔是一个49岁的德克萨斯人,他在2013年6月10日参观了迪斯尼乐园,挣了70000美元。当我的圈在乔的那一排时,我想在表Y中搜索来自德克萨斯州的所有49岁男性,他们也挣70000美元,但在乔之前参观了迪斯尼乐园。我想将表X行分组,表Y的结果集中在一起。在SQL中执行此操作的最佳方法是什么

如果是VB,我知道如何使用带有If语句的FORNEXT循环来实现这一点。但是数据在SQL数据库中,我想学习如何做等效的操作


使用SQL Server Management Studio,您应该能够使用内部联接

比如:

SELECT
 -- [whatever columns you need]
FROM TableZ t1
INNER JOIN TableZ t2 on t1.Salary=t2.Salary
    AND t1.Gender=t2.Gender
    AND t1.ResidenceState=t2.ResidenceState
    AND t1.VisitDate > t2.VisitDate
WHERE t1.Salary=70000
AND t1.Gender='Male'
AND t1.ResidenceState='TX'

显然,这是假定表中有列名和数据类型。连接条件将根据您要匹配的信息而变化。

您应该能够使用内部连接

比如:

SELECT
 -- [whatever columns you need]
FROM TableZ t1
INNER JOIN TableZ t2 on t1.Salary=t2.Salary
    AND t1.Gender=t2.Gender
    AND t1.ResidenceState=t2.ResidenceState
    AND t1.VisitDate > t2.VisitDate
WHERE t1.Salary=70000
AND t1.Gender='Male'
AND t1.ResidenceState='TX'

显然,这是假定表中有列名和数据类型。连接条件将根据您要匹配的信息而变化。

我想您可以这样做:

方法1:加入

方法2:交叉应用更复杂

SELECT Name, Age, Salary, VisitDate, Gender, State
FROM
(
    SELECT TYCA.Name, TYCA.Age, TYCA.Salary,
        TYCA.VisitDate, TYCA.Gender, TYCA.State
    FROM TableX TX
        CROSS APPLY
        (
            SELECT TY.Name, TY.Age, TY.Salary,
              TY.VisitDate, TY.Gender, TY.State
            FROM TableY
            WHERE TY.Age=TX.Age AND TY.Salary=TX.Salary
              AND TY.Gender=TX.Gender AND TY.State=TX.State
              AND TY.VisitDate<TX.VisitDate
        ) TYCA
    WHERE TX.Name = 'Joe' AND ...

    UNION ALL

    SELECT TX.Name, TX.Age, TX.Salary, TX.VisitDate, TX.Gender, TX.State
    FROM TableX TX
    WHERE TX.Name = 'Joe' AND ...
) A

如果将WHERE TX.Name='Joe'和…,查询将得到所有TableX的行以及符合要求的所有TableY的行,而不需要循环。

我想您可以这样做:

方法1:加入

方法2:交叉应用更复杂

SELECT Name, Age, Salary, VisitDate, Gender, State
FROM
(
    SELECT TYCA.Name, TYCA.Age, TYCA.Salary,
        TYCA.VisitDate, TYCA.Gender, TYCA.State
    FROM TableX TX
        CROSS APPLY
        (
            SELECT TY.Name, TY.Age, TY.Salary,
              TY.VisitDate, TY.Gender, TY.State
            FROM TableY
            WHERE TY.Age=TX.Age AND TY.Salary=TX.Salary
              AND TY.Gender=TX.Gender AND TY.State=TX.State
              AND TY.VisitDate<TX.VisitDate
        ) TYCA
    WHERE TX.Name = 'Joe' AND ...

    UNION ALL

    SELECT TX.Name, TX.Age, TX.Salary, TX.VisitDate, TX.Gender, TX.State
    FROM TableX TX
    WHERE TX.Name = 'Joe' AND ...
) A

如果将WHERE TX.Name='Joe'和…,查询将得到所有TableX的行以及符合要求的所有TableY的行,而不需要循环。

如果表X已经有了这些信息,为什么其他客户的行会在表Y中?请提供示例表结构和数据。您使用的是什么数据库管理系统?您应该尽可能避免在SQL中循环。这应该可以通过一套操作来实现。@Martin老实说,我将我关心的客户划分到表X中。但实际上,这都在一个表中,让我们将其称为表Z。因此,对于我关心的每个客户,我希望对表Z运行一个查询,以查看是否有其他类似的客户更早地进入迪斯尼乐园。@squillman使用SQL Server 2008。我洗耳恭听,如何通过一套操作来实现我的最终目标。我不清楚,因为我认为在程序上,也就是在我感兴趣的客户集合中循环,并且寻找匹配项满足上述表Z中的IF条件。我无法想象如何在集合操作中实现这一点。您当然不应该为此编写显式循环。相反,您应该使用连接。如果您发布架构表名和列名的详细信息,以及示例数据和所需输出,您将得到一个有用的答案。如果表X已经有了这些信息,为什么其他客户行会出现在表Y中?请提供示例表结构和数据。您使用的是什么数据库管理系统?您应该尽可能避免在SQL中循环。这应该可以通过一套操作来实现。@Martin老实说,我将我关心的客户划分到表X中。但实际上,这都在一个表中,让我们将其称为表Z。因此,对于我关心的每个客户,我希望对表Z运行一个查询,以查看是否有其他类似的客户更早地进入迪斯尼乐园。@squillman使用SQL Server 2008。我洗耳恭听,如何通过一套操作来实现我的最终目标。我不清楚,因为我认为在程序上,也就是在我感兴趣的客户集合中循环,并且寻找匹配项满足上述表Z中的IF条件。我无法想象如何在集合操作中实现这一点。您当然不应该为此编写显式循环。相反,您应该使用连接。如果您发布模式表名和列名的详细信息,以及示例数据和所需的输出,您将得到一个有用的答案。为什么这么复杂?只是做一个内部连接,是吗?如果你只想生存而不想比较的话,可以选择半连接。谢谢,你是对的。这只是做同样事情的另一种方式。我将添加加入版本。我也没有真正获得联盟。似乎如果你有新的条件,你可以使用或策略性地在一个查询中完成所有的工作。我不太确定工会的所有。。。我曾经

t因为在我看来,他似乎希望两个表的结果都在同一个结果中set:我想将表X行分组,表Y的结果聚在一起。我想他的意思是,我想将TableX和TableY的结果按相关值分组,这对我来说是一个连接,就像斯奎尔曼的答案一样。为什么这么复杂?只是做一个内部连接,是吗?如果你只想生存而不想比较的话,可以选择半连接。谢谢,你是对的。这只是做同样事情的另一种方式。我将添加加入版本。我也没有真正获得联盟。似乎如果你有新的条件,你可以使用或策略性地在一个查询中完成所有的工作。我不太确定工会的所有。。。我之所以使用它,是因为在我看来,他希望两个表的结果都在同一个结果集中:我想将表X行分组,表Y的结果聚在一起。我想他的意思是,我想将TableX和TableY的结果按相关值分组,这对我来说是一个连接,就像斯奎尔曼的回答一样。因为OP对SQL来说相对较新:这称为自连接,是您想要的查询类型的常用习惯用法。谢谢您的建议。您已经清楚地展示了我如何找到其他类似Joe的客户,但在表X的许多行中,表X中只有一行。接下来的客户是Bob、Brian、Mike等,他们有不同的特征,我需要搜索。我如何迭代表X,然后使用新的和不同的标准搜索表Y?表X中的每个新客户?也许,为了更清楚地表达我的问题,我应该这样陈述我的问题:我想在表Y上运行多个查询,表X中的每一行都有一个查询。我希望这更有意义?那么对于表X中的每一行,您有不同的查询参数吗?不是查询值,而是不同的实际参数?@Squillman实际上,参数保持不变,只是值发生了变化。因此,在上面的示例中,我可能希望t1.salary=70000更改为t1.salary=50000,并将性别转换为女性而不是男性,因为表X中的客户恰好是女性。因为OP对SQL来说相对较新:这称为自连接,是您想要的查询类型的常用习惯用法。谢谢您的建议。您已经清楚地展示了我如何找到其他类似Joe的客户,但在表X的许多行中,表X中只有一行。接下来的客户是Bob、Brian、Mike等,他们有不同的特征,我需要搜索。我如何迭代表X,然后使用新的和不同的标准搜索表Y?表X中的每个新客户?也许,为了更清楚地表达我的问题,我应该这样陈述我的问题:我想在表Y上运行多个查询,表X中的每一行都有一个查询。我希望这更有意义?那么对于表X中的每一行,您有不同的查询参数吗?不是查询值,而是不同的实际参数?@Squillman实际上,参数保持不变,只是值发生了变化。因此,在上面的例子中,我可能希望t1.salary=70000更改为t1.salary=50000,并且性别转换为女性而不是男性,因为表X中的客户恰好是女性。