我是脚本和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,那么就不会有任何回报(这是我所期待的)。
我做错了什么?我正在学习,请解释你的答案。谢谢!
答案 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
...