SQL查询'where'不能正常工作

时间:2012-01-10 08:58:47

标签: sql sql-server-2005

我是脚本和SQL的新手,我继承了一些联系人管理软件生成的疯狂数据库。我正在运行Microsoft SQL Server 2005.我要做的是选择满足特定条件的行(最重要的是BIRTHDATE是今天的日期,这似乎可能是我的问题)。这是我的代码:

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和CATEGORY ='Active'条件的记录,它出现了),即使只有一行具有正确的TBL_CONTACT.BIRTHDATE 。它是唯一一行应该在整个列表中工作的BIRTHDATE,即使这些行应该是BIRTHDATE不是今天的日期。如果我这样做就没有与今天相匹配的BIRTHDATE,那么就不会有任何回报(这是我所期待的)。

我做错了什么?我正在学习,请解释你的答案。谢谢!

1 个答案:

答案 0 :(得分: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
   ...