【问题标题】:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <,子查询返回超过 1 个值。当子查询跟在 =、!=、<、
【发布时间】:2013-05-10 11:33:42
【问题描述】:

当我运行以下查询时,我收到上述错误。我意识到这是因为子查询返回超过 1 个结果,但不知道如何修复它。

    update a
    set a.covtypeplus = (SELECT distinct
    REPLACE(REPLACE(ISNULL([BI],'x') + '+' + ISNULL([PD],'x') + '+' +
                    ISNULL([COM],'x') + '+' + ISNULL([COMGL],'x') + '+' + ISNULL([COL],'x') + '+' + ISNULL([COLDW],'x') + '+' +
                    ISNULL([MED],'x') + '+' + ISNULL([PIP],'x') + '+' + ISNULL([PIPNI],'x') + '+' + ISNULL([PIPNR],'x') + '+' +
                    ISNULL([UM],'x') + '+' + ISNULL([UMBI],'x') + '+' + ISNULL([UMBA],'x') + '+' + ISNULL([UMS],'x') + '+' +
                    ISNULL([UMPD],'x') + '+' + ISNULL([UMPA],'x') + '+' +   
                    ISNULL([UIM],'x') + '+'+ ISNULL([UIMBI],'x') + '+' + ISNULL([UIMC],'x') + '+' + ISNULL([UIS],'x') + '+' +
                    ISNULL([UIMPD],'x') + '+' + ISNULL([MEX],'x') + '+' +
                    ISNULL([ACC],'x') + '+' + ISNULL([CPI],'x') + '+' + ISNULL([INC],'x') + '+' + ISNULL([FUN],'x') + '+' + ISNULL([XMD],'x')
                    , 'x+', ''), '+x', '') AS CovTypePlus
    FROM (SELECT distinct POLICYID, VERSION, COVCODE FROM Staging.Coverage) p LEFT JOIN (

    SELECT *
    FROM (
    SELECT POLICYID, VERSION, COVCODE
    FROM Staging.Coverage
    WHERE SUBSTRING(COVCODE, 1, 2) IN ('BI','PD','CO','ME','PI','UM','UI','AC','CP','IN','FU','XM','LD','RA','RE','RO','SP','TO','SG','WM')) p 


    PIVOT (MAX(COVCODE) FOR COVCODE IN (
    [BI], [PD], [COM], [COMGL], [COL], [COLDW],
    [MED], [PIP], [PIPNI], [PIPNR],
    [UM], [UMBI], [UMBA], [UMS], [UMPD], [UMPA],
    [UIM], [UIMBI], [UIMC], [UIS], [UIMPD],
    [ACC], [CPI], [INC], [FUN], [XMD], [LD], [MEX], [RA], [REN], [ROADS], [SPE], [TOW], [SGC], [WMAR]
    )) AS pvt) vc ON p.POLICYID = vc.POLICYID AND p.VERSION = vc.VERSION)

    from results_vehicle a
    left join staging.coverage c on a.polnum =c.policyid and a.polver = c.version and a.covcode = c.COVCODE

当我运行我创建的以下原始查询(不是更新)时,它工作正常,所以它一定是我在更新语法中做错了:

    SELECT DISTINCT p.POLICYID AS PolNum, p.VERSION As PolVer,
    REPLACE(REPLACE(ISNULL([BI],'x') + '+' + ISNULL([PD],'x') + '+' +
                    ISNULL([COM],'x') + '+' + ISNULL([COMGL],'x') + '+' + ISNULL([COL],'x') + '+' + ISNULL([COLDW],'x') + '+' +
                    ISNULL([MED],'x') + '+' + ISNULL([PIP],'x') + '+' + ISNULL([PIPNI],'x') + '+' + ISNULL([PIPNR],'x') + '+' +
                    ISNULL([UM],'x') + '+' + ISNULL([UMBI],'x') + '+' + ISNULL([UMBA],'x') + '+' + ISNULL([UMS],'x') + '+' +
                    ISNULL([UMPD],'x') + '+' + ISNULL([UMPA],'x') + '+' +   
                    ISNULL([UIM],'x') + '+'+ ISNULL([UIMBI],'x') + '+' + ISNULL([UIMC],'x') + '+' + ISNULL([UIS],'x') + '+' +
                    ISNULL([UIMPD],'x') + '+' + ISNULL([MEX],'x') + '+' +
                    ISNULL([ACC],'x') + '+' + ISNULL([CPI],'x') + '+' + ISNULL([INC],'x') + '+' + ISNULL([FUN],'x') + '+' + ISNULL([XMD],'x')
                    , 'x+', ''), '+x', '') AS CovTypePlus
    FROM (SELECT DISTINCT POLICYID, VERSION, COVCODE FROM Staging.Coverage) p LEFT JOIN (

    SELECT *
    FROM (
    SELECT POLICYID, VERSION, COVCODE
    FROM Staging.Coverage
    WHERE SUBSTRING(COVCODE, 1, 2) IN 
('BI','PD','CO','ME','PI','UM','UI','AC','CP','IN','FU','XM','LD','RA','RE','RO','SP','TO','SG','WM')) p 

    PIVOT (MAX(COVCODE) FOR COVCODE IN (
    [BI], [PD], [COM], [COMGL], [COL], [COLDW],
    [MED], [PIP], [PIPNI], [PIPNR],
    [UM], [UMBI], [UMBA], [UMS], [UMPD], [UMPA],
    [UIM], [UIMBI], [UIMC], [UIS], [UIMPD],
    [ACC], [CPI], [INC], [FUN], [XMD], [LD], [MEX], [RA], [REN], [ROADS], [SPE], [TOW], [SGC], [WMAR]
    )) AS pvt) vc ON p.POLICYID = vc.POLICYID AND p.VERSION = vc.VERSION

非常感谢任何帮助,我已经尝试过使用查询并产生相同的结果。我还尝试添加 SELECT TOP 1 并获得所有策略的相同结果。

【问题讨论】:

  • 您能否创建一个有问题的查询的较短版本?减少它直到你发现问题会有所帮助
  • 如果您使用适当的缩进格式化您的 sql 以使其可读,这将有所帮助。

标签: sql sql-server


【解决方案1】:

你正在做:

update a
set a.covtypeplus = (SELECT distinct . . .

这表明您期望从该子查询获得多个结果。不允许。

也许这会解决它,但它可能不是你想要的:

update a
set a.covtypeplus = (SELECT top 1 . . .

【讨论】:

  • 是的,我试过了,但所有策略都得到了相同的结果 BI+PD。原始查询产生如下结果:
  • BI+PD+UMBI BI+PD+PIPNR BI+PD+COM+COL BI+PD BI+PD+PIPNI BI+PD BI+PD BI+PD+UMBI BI+PD+COM+ COL+MED+UMBI+UMPD
  • @user2266677 。 . .确切地。您有多个值,这是不正确的。子查询中可能缺少相关性,例如a.policyid = coverage.policyid
【解决方案2】:

似乎是这部分让你搞砸了:

from results_vehicle a
    left join staging.coverage c on a.polnum =c.policyid
       and a.polver = c.version and a.covcode = c.COVCODE

这必须为 a.covcode 的某些值生成多个结果。

【讨论】:

  • 当我运行它时离开左连接它给了我同样的错误
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多