1

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

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

例如,在表 X 中,我正在查看来自德克萨斯州的 49 岁男子 Joe,他在 2013 年 6 月 10 日访问了迪斯尼乐园,收入 70,000 美元。虽然我的循环在 Joe 的行上,但我想在表 Y 中搜索所有 49来自德克萨斯州的几岁男性,他们也赚了 70,000 美元,但在乔之前参观了迪斯尼乐园。我想将表 X 行和表 Y 中的结果组合在一起(捆绑在一起)。在 SQL 中执行此操作的最佳方法是什么?

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

(使用 SQL Server 管理工作室)

4

2 回答 2

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

于 2013-06-11T21:09:03.350 回答
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 的行,而无需循环。

于 2013-06-11T21:24:11.337 回答