0

私が得る完全なエラーは次のとおりです。

メッセージ 512、レベル 16、状態 1、行 1
サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

過去に機能していたこのSQLコードに渡されたので修正する必要がありますが、上記のエラーが発生しますが、一部をコメントアウトしてもエラーは同じままです

SQLコードは次のとおりです。

SELECT  
    OrderId = OrdNameAdd.ORDERS_ID,
    LTRIM(ISNULL(OrdNameAdd.OBY_FirstName, '') + ' ' + ISNULL(OrdNameAdd.OBY_LASTNAME, '')) AS OrderedByName,
    ObyVar1 = (SELECT varfld_value FROM MAILERVBL WHERE OBYMAILER = MAILERVBL.MAILER_SEQID AND VARDEF_SEQUENCE = 1),
    ObyVar2 = (SELECT varfld_value FROM MAILERVBL WHERE OBYMAILER = MAILERVBL.MAILER_SEQID AND VARDEF_SEQUENCE = 2),
    ObyVar3 = (SELECT varfld_value FROM MAILERVBL WHERE OBYMAILER = MAILERVBL.MAILER_SEQID AND VARDEF_SEQUENCE = 3),
    ExtendedDefaultValue = (SELECT sum(isnull(p.prduct_value,0) *  (isnull(pickdt.prdord_toshipqty,1))) 
                            FROM PICKDT 
                            LEFT OUTER JOIN 
                               locVerBals ON PICKDT.PRVERS_SEQID = locVerBals.PRVERS_Seqid 
                            LEFT OUTER JOIN 
                               LOCPRDSUM p ON locVerBals.PRDUCT_Seqid = p.PRDUCT_SEQID 
                                           AND p.system_id = PICPAK.SYSTEM_ID 
                            WHERE
                               PICKDT.PICPAK_Seqid = PICPAK.PICPAK_Seqid 
                               AND p.PRDUCT_INACTIVEDATE IS NULL), 
    FulfCharges = (rpt_BD.Linesshipped * ACCDEF_ChargePerLine) + ACCDEF_ChargePerShipment, 
    PubFreight = (rpt_BD.PubFreight), 
    TotalValue = 
        (SELECT 
            sum(isnull(p.prduct_value, 0) * (isnull(pickdt.prdord_toshipqty, 1))) 
         from PICKDT 
         LEFT OUTER JOIN locVerBals ON PICKDT.PRVERS_SEQID = locVerBals.PRVERS_Seqid 
         LEFT OUTER JOIN LOCPRDSUM p ON locVerBals.PRDUCT_Seqid = p.PRDUCT_SEQID 
                                     AND p.system_id = PICPAK.SYSTEM_ID 
         WHERE 
             PICKDT.PICPAK_Seqid = PICPAK.PICPAK_Seqid AND p.PRDUCT_INACTIVEDATE IS NULL) 
         + isnull((rpt_BD.Linesshipped * ACCDEF_ChargePerLine), 0) 
         + isnull(ACCDEF_ChargePerShipment,0) + isnull((rpt_BD.PubFreight), 0)
FROM 
    PICPAK 
LEFT OUTER JOIN 
    ORDSTO ON PICPAK.ORDSTO_Seqid = ORDSTO.ORDSTO_Seqid 
LEFT OUTER JOIN 
    OrdNameAdd ON ORDSTO.ORDERS_Seqid = OrdNameAdd.ORDERS_SEQID 
LEFT OUTER JOIN 
    Rpt_BillingDetail rpt_BD ON PICPAK.PICPAK_Seqid = rpt_BD.PICPAK_Seqid 

---------------hERE
WHERE 
    (convert(datetime, DateShipped, 1) >= '4/17/2012' 
     AND convert(datetime, DateShipped, 1) <= '12/17/2012')
---------------HERE

    AND (PICPAK.PICPAK_Status = 'Complete' OR PICPAK.PICPAK_Status = 'Shipped' 
         OR picpak_Status = 'Voided') 
    /*AND (p.PRDUCT_INACTIVEDATE IS NULL)*/
    AND ISNULL(PICPAK.SUPPLR_SEQID,0) = 0
GROUP BY
    OrdNameAdd.ORDERS_ID,
    OrdNameAdd.OBY_FirstName,
    OrdNameAdd.OBY_LASTNAME,
    OrdNameAdd.obymailer,
    PICPAK.PICPAK_Seqid,
    PICPAK.System_Id,
    rpt_BD.PubFreight,
    ACCDEF_ChargePerLine,
    ACCDEF_ChargePerShipment,
    rpt_BD.Linesshipped,
    rpt_BD.Numpackages,
    ordsto.orders_seqid
ORDER BY
    ordsto.orders_seqid ASC
4

5 に答える 5

2

各サブクエリを個別に実行して、どれが複数のレコードを返しているかを調べることをお勧めします

于 2012-12-17T15:54:55.403 に答える
2

クエリには、ObyVar1、ObyVar2、ObyVar3、ExtendedDefaultValue、TotalValue の 5 つのサブクエリがあります。

2 つの値のサブクエリは no の集計を使用してgroup byいるため、1 つの値を返す必要があります。

あなたの問題は、3 つの ObyVars にあります。

これを取り除くには、次の 2 つの簡単な方法があります。

  1. 値を集計します。そうですmax(varfld_value)
  2. 1 つの値を選択します。SQL Server では、これはtop 1(他のデータベースではrownum = 1またはである可能性がありますlimit 1) になります。

ただし、全体として、selectステートメント内のselectステートメントは望ましくないと思います。fromこれら 3 つの変数を、句内のサブクエリに置き換えます。

(select mailer_seqid,
        max(case when vardef_sequence = 1 then varfld_value end) as vv_1, 
        max(case when vardef_sequence = 2 then varfld_value end) as vv_2,
        max(case when vardef_sequence = 3 then varfld_value end) as vv_3
 from mailervbl
 group by mailer_seqid
)

ほとんどの場合、これは 3 つのサブクエリと同じかそれ以上に効率的です。

于 2012-12-17T16:51:06.497 に答える
1

SELECT columns Ex: (1)サブクエリがある場合、またはサブクエリがWHERE col = cluses Ex:(2)ある場合は、単一の値のみが返されることを確認する必要があります。

--Ex:(1) make sure only one row returned by the sub query, 
--this case can be voided using TOP 1 from the sub query
SELECT col1, (SELECT colX from Table2 ) 
FROM Table1

--Ex:(2) this case can be avoided using IN instead =
SELECT col1, col2
FROM Table1
WHERE col3 = (SELECT colX from Table2 ) 
于 2012-12-17T15:58:20.497 に答える
0

データベースにアクセスせずにそれらを特定する方法はないようです。パフォーマンスだけでなく、現在直面している問題についても、このようなwhereステートメントを作成することはお勧めできません。

これを修正するには、完全なロジックを調べてサブクエリなしで書き直すか、ロジック自体を壊さずにサブクエリでDISTINCT /TOP1を介して一部のデータを除外できるかどうかを確認する必要があります。書き直すことをお勧めします。複雑に聞こえることもありますが、物事を単純にします。

于 2012-12-17T15:57:55.727 に答える
0

単一の SUM ステートメントを実行しているサブクエリから重複を取得できないため、問題は MAILERVBL テーブルに対するものです。

重複を探している場合は、次のタイプのコードを実行して重複を識別します。

select MAILER_SEQID, VARDEF_SEQUENCE, count(*) as numentries
from MAILERVBL 
group by MAILER_SEQID, VARDEF_SEQUENCE
having count(*) > 1
order by numentries desc -- not really needed but useful to see where most of your duplicates are

select句とgroup by句の両方で、一意であると予想される列を配置します。

于 2012-12-18T00:56:13.633 に答える