如何遍历SQL表并查找与您的IF条件匹配的行?

时间:2013-06-11 20:51:38

标签: sql sql-server sql-server-2008

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

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

例如,从表X开始,我看着Joe是一名来自德克萨斯州的49岁男子,他在2013年6月10日访问迪斯尼乐园时赚了70,000美元。虽然我的循环在Joe的行上,我想搜索表Y对于来自德克萨斯州的所有49岁男性,他们也赚了7万美元但是在乔之前访问了迪士尼乐园。我想将表X行和表Y的结果组合在一起(聚集在一起)。在SQL中执行此操作的最佳方法是什么?

如果它是VB我知道如何使用For Next语句使用For Next循环。但是数据是在SQL数据库中,我想学习如何做等效的。

(使用SQL Server Management Studio)

2 个答案:

答案 0 :(得分:3)

您应该可以使用INNER JOIN

类似的东西:

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'

显然,假设您的表中有列名和数据类型。 JOIN条件将根据您要匹配的信息而有所不同。

答案 1 :(得分:1)

我想你可以这样做:

方法1:加入

SELECT Name, Age, Salary, VisitDate, Gender, State
FROM
(
    SELECT TY.Name, TY.Age, TY.Salary,
        TY.VisitDate, TY.Gender, TY.State
    FROM TableX TX
        INNER JOIN TableY TY
            ON TY.Age=TX.Age AND TY.Salary=TX.Salary
              AND TY.Gender=TX.Gender AND TY.State=TX.State
              AND TY.VisitDate<TX.VisitDate
    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

方法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' AND ...,查询将获得所有TableX的行,其中所有TableY的行都符合要求,而不需要循环。