如何获取列值优先级超过其他表值

时间:2013-05-30 15:43:02

标签: sql-server-2008

如果有电子邮件,我需要来自tempfinal和title的所有电子邮件,来自htc的first_name,pea。 不确定以下查询是否正确,因为它需要花费更多时间运行10分钟。 使用'AND'代替'OR'只给我4行不正确。请指教

SELECT f.email_address,
       isnull(htc.TITLE, pea.title)           TITLE,
       isnull(htc.FIRST_NAME, pea.FIRST_NAME) FIRST_NAME,
FROM   #tempFinal F,
       htc,
       pea
WHERE  f.EMAIL_ADDRESS = htc.EMAIL_ADDRESS
        OR f.EMAIL_ADDRESS = pea.EMAIL_ADDRESS 

2 个答案:

答案 0 :(得分:1)

试试这个:

    SELECT  F.EMAIL_ADDRESS,
            ISNULL(H.TITLE,P.TITLE) TITLE,
            ISNULL(H.FIRST_NAME,P.FIRST_NAME) FIRST_NAME
    FROM #tempFinal F
    LEFT JOIN htc H
        ON F.EMAIL_ADDRESS = H.EMAIL_ADDRESS
    LEFT JOIN pea P
        ON F.EMAIL_ADDRESS = P.EMAIL_ADDRESS 

您应该停止使用隐式连接,而是使用显式ANSI连接。这将帮助您避免意外的笛卡尔产品(我想这是您当前的问题)

答案 1 :(得分:0)

我认为where子句中的条件或条件基本上是创建交叉连接情况。

试试这个:

SELECT f.email_address,
       isnull(htc.TITLE, pea.title)           TITLE,
       isnull(htc.FIRST_NAME, pea.FIRST_NAME) FIRST_NAME,
FROM   #tempFinal F
       Left Join htc
        on f.EMAIL_ADDRESS = htc.EMAIL_ADDRESS
       Left Join pea
        on f.EMAIL_ADDRESS = pea.EMAIL_ADDRESS