Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Join子句中的Case语句_Sql_Sql Server - Fatal编程技术网

Sql Join子句中的Case语句

Sql Join子句中的Case语句,sql,sql-server,Sql,Sql Server,我试图从多个表中获取数据,但不确定如何做到这一点。下面是我正在使用的一个查询,但它不起作用。请建议 SELECT DISTINCT VWL.Type, VWL.ID AS CompanyID,VWL.Name FROM dbo.LeadList_New AS VWL LEFT OUTER JOIN CASE VWL.Type WHEN 'COMPANY' THEN CRMCompanyEmailAddress AS CE

我试图从多个表中获取数据,但不确定如何做到这一点。下面是我正在使用的一个查询,但它不起作用。请建议

SELECT DISTINCT 
        VWL.Type, VWL.ID AS CompanyID,VWL.Name
    FROM dbo.LeadList_New AS VWL 
    LEFT OUTER JOIN
        CASE VWL.Type WHEN 'COMPANY' THEN
            CRMCompanyEmailAddress AS CE ON VWL.ID=CE.CRMCompanyID
        WHEN 'PERSON' THEN
            PersonEmailAddress AS PE ON VWL.ID=PE.PersonID
        END

您不能将表与
案例
联接,可能您希望这样:

SELECT DISTINCT VWL.Type, VWL.ID AS CompanyID, VWL.Name, 
                CASE WHEN VWL.type = 'COMPANY' 
                    THEN CE.Name 
                    ELSE PE.Name 
                END AS EntityName 
FROM   dbo.leadlist_new AS VWL 
       LEFT OUTER JOIN crmcompanyemailaddress AS CE 
                    ON VWL.id = CE.crmcompanyid 
       LEFT OUTER JOIN personemailaddress AS PE 
                    ON VWL.id = PE.personid 

您应该将CASE语句移动到SELECT正文中:

SELECT DISTINCT 
         VWL.Type, VWL.ID AS CompanyID,VWL.Name

        case VWL.Type 
              when 'COMPANY' then  CE.Address
              when 'PERSON' then PE.Address
        end


FROM        dbo.LeadList_New AS VWL  
LEFT OUTER JOIN CRMCompanyEmailAddress as CE on VWL.ID=CE.CRMCompanyID
LEFT OUTER JOIN PersonEmailAddress as PE on VWL.ID=PE.PersonID
或者只是为公司和个人合并两份声明

SELECT VWL.Type, VWL.ID AS CompanyID,VWL.Name,CE.Address as Address 
FROM        dbo.LeadList_New AS VWL  
LEFT OUTER JOIN CRMCompanyEmailAddress as CE on VWL.ID=CE.CRMCompanyID
WHERE VWL.Type='COMPANY'

UNION

SELECT VWL.Type, VWL.ID AS CompanyID,VWL.Name,PE.Address as Address
FROM        dbo.LeadList_New AS VWL  
LEFT OUTER JOIN PersonEmailAddress as PE on VWL.ID=PE.PersonID
WHERE VWL.Type='PERSON'

任何特定的SQL语句都必须具有特定的“形状”——涉及哪些表、列等,它们的类型等等。更改查询中包含哪些表的唯一方法是将其构造为字符串(动态SQL)。也就是说,我不清楚您想要实现什么-您在联接的
左侧的
列上执行了一个不同的操作,并且在
右侧的
列上没有选择任何列-即使根本没有发生联接,整个查询的结果也将是相同的。你能解释一下你想要实现什么吗?请在描述中添加一个表中数据的例子。我认为联合是最好的选择。也许使用UNION ALL来代替。@Dd2主题启动程序需要不同的行,所以我使用UNION来消除所有的重复