2012-01-10 70 views
0

我對腳本和SQL非常陌生,並且繼承了一些由聯繫人管理軟件生成的瘋狂數據庫。我正在運行Microsoft SQL Server 2005.我想要做的是選擇符合某些條件的行(最重要的是BIRTHDATE是今天的日期,這看起來可能是我的問題)。這裏是我的代碼:SQL查詢'哪裏'沒有按我期望的那樣工作

SELECT 
    TBL_CONTACT.BIRTHDATE, 
    TBL_CONTACT.COMPANYNAME, 
    TBL_CONTACT.CATEGORY, 
    CUST_ContactTable1_074000.CUST_DesignatedAgent_074203199, 
    TBL_EMAIL.ADDRESS 
FROM 
    TBL_CONTACT, 
    CUST_ContactTable1_074000, 
    TBL_EMAIL 
WHERE 
    TBL_CONTACT.BIRTHDATE >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) AND 
    TBL_CONTACT.BIRTHDATE < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) AND 
    TBL_CONTACT.CATEGORY = 'Active' AND TBL_EMAIL.ADDRESS IS NOT NULL AND 
    CUST_ContactTable1_074000.CUST_DesignatedAgent_074203199 IS NOT NULL 

的問題是,它是在我的數據庫返回所有行(減去記錄不符合NOT NULL和類別=「活動」的條件下,出現的話),即使有應該只有一行具有正確的TBL_CONTACT.BIRTHDATE。它將BIRTHDATE放在應該處理整個列表的唯一行中,即使這些行應該包含BIRTHDATE而不是今天的日期。如果我這樣做沒有今天匹配的BIRTHDATE,沒有東西會返回(這是我所期望的)。

我在做什麼錯?請解釋你的答案,因爲我期待學習。謝謝!

+1

格式和正確縮進查詢。 – Lion 2012-01-10 09:01:15

回答

5

表之間的連接條件在哪裏?
既然這樣,你有一個cross join a.k.a Cartesian product

... 
FROM 
    TBL_CONTACT C 
    JOIN 
    CUST_ContactTable1_074000 CT ON C.Something = CT.Something 
    JOIN 
    TBL_EMAIL E ON C.Anotherthing = CT.Anotherthing 
WHERE 
    ... 
+0

您是否基於常見的唯一標識符基本上鍊接了不同的表?對不起,我對這個東西非常陌生。我需要用什麼來代替'Something'和'Anotherthing'?無論如何,我可以用它來告訴它是不同表格中的相同記錄?鑰匙? – eulogy 2012-01-10 09:12:11

+0

是的,這是JOIN的一點。如果你是新人,那麼我也建議你進行基礎研究或培訓 – gbn 2012-01-10 09:31:50

+0

謝謝,夥計。我得到它的工作!我大概在6小時前就開始了,即使是語法的概念(一般來說)也很難理解,而且我買不起學校。我跑進了一堵牆,沒有詢問就找不到我需要做的事情。我通過頭先潛水學習最好,但偶爾我需要方向。感謝您不要居高臨下。 – eulogy 2012-01-10 10:42:28

相關問題