다음 쿼리를 실행합니다.
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
다음과 같은 오류가 발생합니다.
메시지 512, 수준 16, 상태 1, 줄 2 하위 쿼리가 둘 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, <=,>,> = 뒤에 오는 경우 또는 하위 쿼리가 표현식으로 사용되는 경우에는 허용되지 않습니다.
어떤 아이디어?
답변
이 시도:
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 값을 반환하면 (=,! =, <>, <,> ….)
- else (하나 이상의 값),이 경우 (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 개를 추가하고 순서를 지정합니다 (DBA가 싫어하는 불쾌한 솔루션-하지만 “작동”).
- 사용자 정의 함수를 사용하여 하위 쿼리의 결과를 단일 문자열로 연결
답변
데이터가 나쁘거나 생각하는 방식으로 구조화되지 않았습니다. 둘 다 가능합니다.
이 가설을 증명 / 반증하려면 다음 쿼리를 실행하십시오.
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
항목을 여러 번 포함하는 광고 주문이 있다고 생각합니다 (두 개의 개별 광고 항목, 둘 다 같은 항목을 주문 함 SKU
).
답변
수정 사항은 상관 하위 쿼리 사용을 중지하고 대신 조인을 사용하는 것입니다. 상관 된 하위 쿼리는 쿼리가 행 단위로 실행되도록하고 피해야하므로 본질적으로 커서입니다.
하나의 레코드 만 일치 시키려면 필드에서 원하는 값을 얻기 위해 조인에 파생 테이블이 필요할 수 있습니다. 두 값이 모두 필요한 경우 일반 사용자 join
가 수행하지만 동일한 ID에 대해 여러 레코드를 얻습니다. 결과 세트에서. 당신이 하나를 원하는 경우에, 당신은 어느 하나를 결정해야하고 코드에서, 당신이 사용할 수 그렇게 top 1
와 함께 order 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'
);