1

これが私がやりたいことです。ディズニーランドのような遊園地に入場した顧客のテーブル (テーブル X) があるとします。この顧客テーブルは非常に詳細で、名前、年齢、人種、収入レベル、出身地の郵便番号、入園時刻のタイム スタンプなどの列があります。

テーブル X の各行について、別の顧客情報テーブル (テーブル Y) にクエリを実行して、問題の行と共通の特徴を共有し、以前にディズニーランドの施設に入った他のすべての顧客を識別したいと考えています。

たとえば、テーブル X から、2013 年 6 月 10 日にディズニーランドを訪れたテキサス出身の 49 歳の男で、70,000 ドルを稼いでいるジョーを見ています。ループがジョーの行にある間、テーブル Y で 49 人すべてを検索したいと思います。 70,000 ドルを稼いでいるが、ジョーの前にディズニーランドを訪れたテキサス出身の 1 歳の男性。テーブル X の行と、テーブル Y の結果をグループ化 (まとめて) したいと考えています。SQLでこれを行う最良の方法は何ですか?

VB の場合、内部に If ステートメントを含む For Next ループを使用してこれを行う方法を知っています。しかし、データは SQL データベースにあり、同等の方法を学びたいと思っています。

(SQL Server Management Studio を使用)

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

私はあなたがこれを行うことができると思います:

方法 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: 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 ...と、クエリは、ループを必要とせずに、要件に準拠するすべての TableY の行を含むすべての TableX の行を取得します。

于 2013-06-11T21:24:11.337 に答える