2013-06-11 38 views
1

这是我想要做的。假设我有一张顾客桌(表X),他们进入了迪士尼乐园等游乐园。这张客户表格非常详细,包含姓名,年龄,种族,收入水平,邮政编码等信息以及进入公园时的时间戳。如何遍历SQL表并查找符合IF条件的行?

对于表X的每一行,我想查询另一个客户信息表(表Y),以确定谁在质疑该行一些共同特征所有其他客户,谁已经在较早的进入了迪斯尼乐园场地时间点。

例如,从表X我看着Joe是一位来自得克萨斯州的49岁男子,他在2013年6月10日访问了迪斯尼乐园,赚取了70000美元。当我的循环在Joe的行中时,我想要搜索Table Y是来自得克萨斯州的所有49岁男性,他们还赚取了70,000美元,但在拜访乔之前参观了迪士尼乐园。我想将Table X行和Table Y的结果组合在一起(聚集在一起)。在SQL中执行此操作的最佳方式是什么?

如果是VB,我知道如何使用If语句中的For Next循环执行此操作。但数据在SQL数据库中,我想学习如何做同样的事情。

(使用SQL Server Management Studio中)

+1

如果表X已经有了这些信息,为什么其他客户的行会在表Y中?请提供示例表结构和数据。 –

+1

你正在使用哪些DBMS?尽可能避免在SQL中循环。这应该能够通过设置操作发生。 – squillman

+0

@Martin老实说,我把我关心的顾客分成了表X.但实际上,这些都在一个表中,我们称之为表Z.因此,对于我关心的每个顾客(一组),我想运行一个根据表Z查询是否有其他类似的客户早日进入迪士尼乐园。 – phan

回答

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条件会根据您想要匹配的信息而有所不同。

+0

由于OP对于SQL来说是比较新的:这被称为**自连接**,并且是您想要的那种查询的通常习惯用法。 –

+0

谢谢你的建议。您已经清楚地显示了我可以如何找到其他“类似Joe”的客户,但这只是表X中许多行中的表X中的唯一一行。接下来的客户是Bob,Brian,Mike等,他们具有不同的特征我需要搜索。我如何迭代表X,然后使用表X中每个新客户持有的新的和不同的标准来搜索表Y? – phan

+0

也许,在努力短语我的问题更清楚,我应该说明我的问题是这样的:我想在数据表Y运行多个查询,对于存在于表X每行一个查询我希望,更有意义? – phan

1

我想你可以这样做:

方法1:JOIN

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:CROSS APPLY(更复杂)

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的行都符合requirem而不需要循环。

+0

为什么这么复杂?只是做一个内部连接,是吗?或者如果你只是想要存在而不是比较,那就是半连接。 – ErikE

+0

谢谢,你说得对。这是做同样事情的另一种方式。我将添加连接版本。 –

+0

我并没有真正获得'UNION ALL'。看起来如果你有新的条件,你可以用'OR'和'AND'战略性地在一个查询中完成所有事情。 – ErikE