繁体   English   中英

SQL左外连接有条件

[英]SQL Left Outer Join Conditionally

我在MS SQL中运行一个非常有条件的查询。 我已经继承了这个数据库,它的结构无法更改。 由于设计不良,一个字段(PlantName)可以容纳一个字符串或一个int,该int用来引用另一个表(SoilSpecies)中的字符串。 我试图将所有内容都保留在一个查询中,并且试图将“土壤种类”表引入“左外部联接”中。 我无法将许多行中的PlantName字符串与SoilSpecies上的Int主键进行比较的问题。

例子是:

“将nvarchar值'rose'转换为数据类型int时转换失败。”

我想知道是否有可能将字段的内容有条件地设置为“ 0”(如果出于联接目的,它尚未在INT上)。

select distinct sv.sampleno, sv.plantName,
sv.tests, sv.plantNameOther, sv.originalsubmitContact, 
sv.sampletype, sv.test_foliar, sv.form, 
COALESCE (ci.clname, BTE_Customer.name) AS clname,
o.officename,  

CAST(di.id as BIT) as DIAGIMAGES,

sv.PlantLocation,
CASE 
WHEN (sv.form = 'soils') THEN sv.plantName
ELSE NULL
END
AS sampleType,


CASE
WHEN (sv.form = 'soils') THEN ss.name
ELSE NULL
END
AS ssName

from searchview sv  
left outer join clientinfo  ci on 
    sv.clientid = ci.clientid 
left outer join  BTE_Customer on 
    BTE_Customer.BTE_ID = sv.BTE_ID
left outer join  BTE_CustomerProperty on 
    sv.BTE_ID = BTE_CustomerProperty.BTE_ID AND sv.Property_ID = BTE_CustomerProperty.Property_ID
left outer join offices o on
    sv.officeID = o.officeID
left outer join reply r on 
    sv.sampleno = r.sampleno
left outer join diagnosticimages di on 
    sv.sampleno = di.sampleno
left outer join SoilsSpecies ss on
    (sv.plantname = ss.name) or (sv.plantname = ss.SpeciesID) 



WHERE (not sv.sampleno = 0)

and form in ('Soils','Plants')




AND (ci.clname like '%NAME%' or BTE_Customer.name like '%NAME%')

您需要一个短路运算符(CASE)来避免类型不匹配。 我还没有真正测试过,但是您可以尝试以下方法。 将您对SoilsSpecies的加入更改为以下内容:

left outer join SoilsSpecies ss on
    1 = case when isnumeric(sv.plantname) = 1 then 
            case when sv.plantname = ss.SpeciesID then 1 end
        when sv.plantname = ss.name then 1
        else 0
        end

我不知道这是否是处理此问题的最佳方法,但它确实有效。 我只是能够将INT字段从外部表转换为NVARCHAR并将其与原始表中的字符串字段进行比较。 这样,我在不匹配的行中得到空值。 这是我一直在寻找的逻辑,稍后我只检查Null。

我用以下内容替换了我的最后一个LEFT OUTER JOIN:

left outer join SoilsSpecies ss on
    (CONVERT(nvarchar,ss.speciesID) = sv.plantname)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM