2012-01-10 48 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

相关问题