2013-06-11 40 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