programing

SQL Server 하위 쿼리가 1개 이상의 값을 반환했습니다.하위 쿼리가 =, !=, <, <=, >, >=를 따르는 경우에는 허용되지 않습니다.

subpage 2023. 5. 14. 10:41
반응형

SQL Server 하위 쿼리가 1개 이상의 값을 반환했습니다.하위 쿼리가 =, !=, <, <=, >, >=를 따르는 경우에는 허용되지 않습니다.

다음 쿼리를 실행합니다.

SELECT 
   orderdetails.sku,
   orderdetails.mf_item_number,
   orderdetails.qty,
   orderdetails.price,
   supplier.supplierid,
   supplier.suppliername,
   supplier.dropshipfees,
   cost = (SELECT supplier_item.price
           FROM   supplier_item,
                  orderdetails,
                  supplier
           WHERE  supplier_item.sku = orderdetails.sku
                  AND supplier_item.supplierid = supplier.supplierid)
FROM   orderdetails,
       supplier,
       group_master
WHERE  invoiceid = '339740'
       AND orderdetails.mfr_id = supplier.supplierid
       AND group_master.sku = orderdetails.sku  

다음 오류가 발생합니다.

Msg 512, 레벨 16, 상태 1, 라인 2 하위 쿼리가 1개 이상의 값을 반환했습니다.하위 쿼리가 =, !=, <, <=, >, >=를 따르거나 하위 쿼리가 식으로 사용되는 경우에는 허용되지 않습니다.

아이디어 있어요?

사용해 보십시오.

SELECT
    od.Sku,
    od.mf_item_number,
    od.Qty,
    od.Price,
    s.SupplierId,
    s.SupplierName,
    s.DropShipFees,
    si.Price as cost
FROM
    OrderDetails od
    INNER JOIN Supplier s on s.SupplierId = od.Mfr_ID
    INNER JOIN Group_Master gm on gm.Sku = od.Sku
    INNER JOIN Supplier_Item si on si.SKU = od.Sku and si.SupplierId = s.SupplierID
WHERE
    od.invoiceid = '339740'

이게하다제외동일여반행다환니됩이러한고하렇음면을 하고 동일한 행이 여러 개 됩니다.cost. 되는 여러 을 보고 하십시오.반환되는 다양한 비용 값을 살펴보고 다양한 값의 원인이 무엇인지 파악합니다.그런 다음 다른 사용자에게 원하는 비용 값을 묻고 해당 비용을 선택할 기준을 쿼리에 추가합니다.

쿼리를 실행하려는 테이블에 트리거가 있는지 확인합니다.테이블에 있는 업데이트/선택/삽입 트리거를 실행하려고 할 때 이 오류가 발생할 수 있습니다.

실행하려는 쿼리에 대해 트리거를 실행할 필요가 없는 경우 쿼리를 수정하여 비활성화한 후 트리거를 활성화할 수 있습니다.

ALTER TABLE your_table DISABLE TRIGGER [the_trigger_name]

UPDATE    your_table
SET     Gender = 'Female'
WHERE     (Gender = 'Male')

ALTER TABLE your_table ENABLE TRIGGER [the_trigger_name]
SELECT COLUMN 
    FROM TABLE 
WHERE columns_name
    IN ( SELECT COLUMN FROM TABLE WHERE columns_name = 'value');

참고: 하위 항목을 사용할 때는 다음 사항에 중점을 두어야 합니다.

  1. 이 경우 하위 쿼리가 1개의 값을 반환하는 경우 사용해야 합니다(=,!=,<,><,>....).
  2. 그렇지 않은 경우(둘 이상의 값), 이 경우에는 사용해야 합니다(in, any, all, some).
cost = Select Supplier_Item.Price from Supplier_Item,orderdetails,Supplier 
   where Supplier_Item.SKU=OrderDetails.Sku and 
      Supplier_Item.SupplierId=Supplier.SupplierID

이 하위 쿼리는 여러 개의 값을 반환합니다. SQL은 단일 레코드에 여러 개의 값을 할당할 수 없어 불만입니다.

몇 가지 아이디어:

  1. 기존 하위 쿼리가 레코드 1개만 반환하도록 데이터 수정
  2. 레코드를 하나만 반환하도록 하위 쿼리 수정
  3. 하위 쿼리에 상위 1개를 추가하고 (DBA가 싫어하지만 "작동"하는 불쾌한 솔루션)
  4. 사용자 정의 함수를 사용하여 하위 쿼리 결과를 단일 문자열로 연결

수정 사항은 상관된 하위 쿼리 사용을 중지하고 대신 조인을 사용하는 것입니다.상관 하위 쿼리는 기본적으로 커서이며, 쿼리가 행별로 실행되도록 하므로 피해야 합니다.

의 레코드만 시키려면 필드에서할 수 . 두한 경우 이 필요합니다.join그러면 결과 집합에 동일한 ID에 대한 레코드가 여러 개 표시됩니다.만약 당신이 하나만 원한다면, 당신은 어떤 것을 결정하고 코드에서 그것을 할 필요가 있습니다, 당신은 사용할 수 있습니다.top 1order by당신은 사용할 수 있습니다.max()당신은 사용할 수 있습니다.min()데이터에 대한 실제 요구 사항에 따라 등이 달라집니다.

저도 같은 문제가 있었어요, 전에in=Northwind예: 이터베스예제:

쿼리: 1997년에 주문한 회사 찾기

사용해 보십시오.

SELECT CompanyName
    FROM Customers
WHERE CustomerID IN (
                        SELECT CustomerID 
                            FROM Orders 
                        WHERE YEAR(OrderDate) = '1997'
                    );

대신에:

SELECT CompanyName
    FROM Customers
WHERE CustomerID =
(
    SELECT CustomerID 
        FROM Orders 
    WHERE YEAR(OrderDate) = '1997'
);

데이터가 잘못되었거나 사용자가 생각하는 방식으로 구성되지 않았습니다.둘 다일 수도 있습니다.

이 가설을 입증하거나 입증하려면 다음 쿼리를 실행합니다.

SELECT * from
(
    SELECT count(*) as c, Supplier_Item.SKU
    FROM Supplier_Item
    INNER JOIN orderdetails
        ON Supplier_Item.sku = orderdetails.sku
    INNER JOIN Supplier
        ON Supplier_item.supplierID = Supplier.SupplierID
    GROUP BY Supplier_Item.SKU
) x
WHERE c > 1
ORDER BY c DESC

이것이 몇 개의 행만 반환하면 데이터가 불량해집니다.행이 많이 반환되면 데이터가 생각하는 대로 구성되지 않습니다. (행이 0개만 반환되면 제가 잘못했습니다.)

한 같내용주문있이는은 것 같 다 습 니 의 같 것 니SKU 번 개의 행 항목 한 여러번두, 둘동한주문목항인라도, 다일별의개,두)주▁the▁multiple▁(문▁itemsSKU).

선택 항목의 비용 부분에 있는 선택 문이 둘 이상의 값을 반환하고 있습니다.where 절을 추가하거나 집계를 사용해야 합니다.

이 오류는 이 하위 쿼리가 하나 이상의 행을 반환하고 있음을 의미합니다.

(Select Supplier_Item.Price from Supplier_Item,orderdetails,Supplier where Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID )

외부 쿼리의 테이블에서 선택한 값을 참조하려는 경우 하위 쿼리에 주문 세부 정보 및 공급업체 테이블을 포함하지 않을 수 있습니다.따라서 하위 질의는 다음과 같습니다.

(Select Supplier_Item.Price from Supplier_Item where Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID )

상관관계가 있는 하위 쿼리와 상관관계가 없는 하위 쿼리를 읽어보시기 바랍니다.

다른 사람들이 제안했듯이, 이를 위한 가장 좋은 방법은 변수 할당 대신 조인을 사용하는 것입니다.조인을 사용하기 위해 쿼리를 다시 작성하면(그리고 제안된 암묵적인 조인 대신 명시적인 조인 구문을 사용하는 것이 가장 좋습니다) 다음과 같은 결과를 얻을 수 있습니다.

select  
  OrderDetails.Sku,
  OrderDetails.mf_item_number,
  OrderDetails.Qty,
  OrderDetails.Price,
  Supplier.SupplierId, 
  Supplier.SupplierName,
  Supplier.DropShipFees, 
  Supplier_Item.Price as cost
from 
  OrderDetails
join Supplier on OrderDetails.Mfr_ID = Supplier.SupplierId
join Group_Master on Group_Master.Sku = OrderDetails.Sku 
join Supplier_Item on 
  Supplier_Item.SKU=OrderDetails.Sku and Supplier_Item.SupplierId=Supplier.SupplierID 
where 
  invoiceid='339740' 

원래 자리에 오른 지 9년이 지났음에도, 이것은 저에게 도움이 되었습니다.

아무런 단서도 없이 이러한 유형의 오류를 수신하는 경우 테이블과 관련된 트리거, 함수가 있어야 하며 SP로 끝나거나 데이터를 선택/필터링하는 기능이 있어야 합니다.기본 고유 열을 사용하여 검색/필터링하는 경우 여러 개의 결과가 나타나지 않습니다.특히 선언된 변수에 값을 할당할 때는 더욱 그렇습니다.SP는 오류를 제공하지 않고 런타임 오류만 제공합니다.

 "System.Data.SqlClient.SqlException (0x80131904): Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated."

저의 경우에는 분명히 단서가 없었고, 오직 이 오류 메시지만 있었습니다.테이블에 연결된 트리거가 있었고 트리거에 의해 업데이트된 테이블에도 다른 트리거가 있었습니다. 마찬가지로 트리거는 두 개로 종료되고 SP로 종료되었습니다.SP에 여러 행을 생성하는 select 절이 있습니다.

SET @Variable1 =(
        SELECT column_gonna_asign
        FROM dbo.your_db
        WHERE Non_primary_non_unique_key= @Variable2

여러 행이 반환되면 문제가 발생합니다.

SSMS 19.0.1에서 매개 변수 선언이 잘못되었을 때 이 메시지를 받았습니다!오해의 소지가 많습니다.

declare @Code varchar = 'N79R-1ZZE-3CW6-C3KM'
  select * from GetSensorDetails( @Code);  // <-- error pointed here.

GetSensorDetails() 라인에서 오류가 보고되었습니다.올바른 선언을 사용하려면 다음과 같은 막대 길이가 필요합니다.

declare @Code varchar(20) = 'N79R-1ZZE-3CW6-C3KM'  // <-- error actually was here

이것으로 해결했습니다.이것이 누군가에게 도움이 되기를 바랍니다!

언급URL : https://stackoverflow.com/questions/2653188/sql-server-subquery-returned-more-than-1-value-this-is-not-permitted-when-the-s

반응형