복붙노트

[SQL] SQL 서버 하위 쿼리는 1 개 이상의 값을 반환했습니다. 이 허용되지 않는 서브 쿼리가 다음에 올 때 =,! =, <, <=,>,> =

SQL

SQL 서버 하위 쿼리는 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  

나는 다음과 같은 오류가 발생합니다 :

어떤 아이디어?

해결법

  1. ==============================

    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'
    

    이 비용 항목을 제외하고 동일한 여러 행을 반환합니다. 반환과 다른 값을 원인을 파악하는 다른 비용 값을 봐. 그리고 그들이 원하는 사람이되는 비용 값을 요청하고, 그 비용을 선택합니다 쿼리에 조건을 추가 할 수 있습니다.

  2. ==============================

    2.당신이에 대해 쿼리를 실행하려고하는 테이블에 어떤 트리거가 있는지 확인하십시오. 그들은 테이블에 트리거 삽입 / / 업데이트를 실행 선택하려고으로 그들은 때때로이 오류가 발생 할 수 있습니다.

    당신이에 대해 쿼리를 실행하려고하는 테이블에 어떤 트리거가 있는지 확인하십시오. 그들은 테이블에 트리거 삽입 / / 업데이트를 실행 선택하려고으로 그들은 때때로이 오류가 발생 할 수 있습니다.

    당신은 트리거가 실행하려는 어떤 쿼리를 실행해야하지 않는 경우 트리거를 사용하지 않도록 설정하는 쿼리를 수정할 수 있습니다.

    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]
    
  3. ==============================

    3.

    SELECT COLUMN 
        FROM TABLE 
    WHERE columns_name
        IN ( SELECT COLUMN FROM TABLE WHERE columns_name = 'value');
    

    주의 : 우리는 하위 쿼리를 사용할 때 우리는 점에 집중해야

  4. ==============================

    4.

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

    이 하위 쿼리는 여러 값을 반환 SQL은 불평이 하나의 레코드에서 비용하지 할당 여러 값을 수 있기 때문이다.

    몇 가지 아이디어 :

  5. ==============================

    5.어느 데이터가 나쁜 경우, 또는 당신이 생각하는 방법을 구성 아니에요. 아마 둘 다.

    어느 데이터가 나쁜 경우, 또는 당신이 생각하는 방법을 구성 아니에요. 아마 둘 다.

    / 증명이 가설을 반증하기 위해,이 쿼리를 실행 :

    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
    

    이 반환 몇 행을 경우, 데이터가 나쁘다. 이 행을 많이 돌려주는 경우, 데이터 당신이 생각하는 방법을 구성하지 않습니다. (제로 행을 반환하는 경우, 내가 틀렸다.)

    난 당신 같은 SKU를 여러 번 (두 개의 별도의 광고 항목 모두 주문 같은 SKU)를 포함하는 주문을 같은데요.

  6. ==============================

    6.수정은 상관 하위 쿼리 사용을 중지하고 사용 대신에 합류했다. 그들이 행 단위를 실행하는 쿼리의 원인 피해야한다으로 상관 하위 쿼리는 기본적으로 커서입니다.

    수정은 상관 하위 쿼리 사용을 중지하고 사용 대신에 합류했다. 그들이 행 단위를 실행하는 쿼리의 원인 피해야한다으로 상관 하위 쿼리는 기본적으로 커서입니다.

    당신이 다음 두 값이 필요한 경우 당신이 일치하는 단 하나 개의 기록을 원하는 경우 필드에 원하는 값을 얻기 위해 가입에 당신은 파생 테이블을해야 할 수도 있습니다, 보통은 그러나이 같은 여러 기록을 얻을 것이다 할 것 가입 결과의 ID를 설정합니다. 당신이 하나를 원하는 경우에, 당신은, 당신은 무엇에 따라 등 분 ()를 사용할 수 있습니다) (당신이 최대 사용할 수있는 코드에서, 당신에 의해 주문으로 상위 1을 사용할 수있는 하나를 결정해야하고 할 당신의 데이터에 대한 실제 요구 사항입니다.

  7. ==============================

    7.나는에서는 Northwind 데이터베이스의 예에서, = 대신에 사용, 같은 문제가 있었다 :

    나는에서는 Northwind 데이터베이스의 예에서, = 대신에 사용, 같은 문제가 있었다 :

    이 시도 :

    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'
    );
    
  8. ==============================

    8.당신의 선택의 비용 부분에 SELECT 문은 하나 개 이상의 값을 반환합니다. 당신은 더 조항을 추가하거나 집계를 사용해야합니다.

    당신의 선택의 비용 부분에 SELECT 문은 하나 개 이상의 값을 반환합니다. 당신은 더 조항을 추가하거나 집계를 사용해야합니다.

  9. ==============================

    9.이 오류는이 하위 쿼리는 1 개 이상의 행을 반환하는 것을 의미한다 :

    이 오류는이 하위 쿼리는 1 개 이상의 행을 반환하는 것을 의미한다 :

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

    당신은 아마 당신이 외부 쿼리에서 해당 테이블에서 선택된 값을 참조 할 때문에, 서브 쿼리의 OrderDetails의 및 공급 업체 테이블을 포함하지 않습니다. 그래서 난 당신이 하위 쿼리는 단순히되고 싶은 생각 :

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

    난 당신이 상관 관계 대 비 상관 서브 쿼리에 읽어 좋습니다.

  10. ==============================

    10.다른 제안으로,이 작업을 수행하는 가장 좋은 방법은 대신 변수 할당의 조인을 사용하는 것입니다. (대신 암시 적으로 조인 구문을 또한 제안 된, 가입하고 명시를 사용 - 그리고 가장 좋은 방법입니다) 조인을 사용하도록 쿼리를 재 - 쓰기, 당신이 뭔가를 얻을 것입니다 :

    다른 제안으로,이 작업을 수행하는 가장 좋은 방법은 대신 변수 할당의 조인을 사용하는 것입니다. (대신 암시 적으로 조인 구문을 또한 제안 된, 가입하고 명시를 사용 - 그리고 가장 좋은 방법입니다) 조인을 사용하도록 쿼리를 재 - 쓰기, 당신이 뭔가를 얻을 것입니다 :

    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' 
    
  11. ==============================

    11.심지어 원래의 게시물 9 년 후,이 저를 도왔다.

    심지어 원래의 게시물 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
    

    이 여러 행을 반환하는 경우, 당신은 문제가 있습니다.

  12. from https://stackoverflow.com/questions/2653188/sql-server-subquery-returned-more-than-1-value-this-is-not-permitted-when-the-s by cc-by-sa and MIT license