Подзапрос SQL Server возвратил больше чем 1 значение. Это не разрешено, когда подзапрос следует =! =, <<=>,> =

Я использую jQuery 1.11.1 и для этой версии я должен использовать вместо «on» функцию «live».

73
задан TT. 12 November 2016 в 06:42
поделиться

8 ответов

Попробуйте следующее:

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 . Посмотрите на возвращаемые различные значения стоимости и выясните, что вызывает разные значения. Затем спросите кого-нибудь, какую стоимость они хотят, и добавьте критерии к запросу, который выберет эту стоимость.

44
ответ дан 24 November 2019 в 12:16
поделиться

Даже после 9 лет исходного сообщения, это помогло мне.

при получении этих типов ошибок без какой-либо подсказки должен быть триггер, функция, связанная с таблицей, и очевидно это должно закончиться с SP или функцией с выбором/фильтрацией данных столбец NOT USING Primary Unique. Если Вы будете искать/фильтровать использование столбца Primary Unique то не будет никаких нескольких результатов. Особенно, когда Вы присваиваете значение для заявленной переменной. SP никогда не дает Вам en ошибку, но только ошибку периода выполнения.

 "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 имел избранный пункт, который приводил к нескольким строкам.

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

, Если это возвращает несколько строк, Вы в беде.

0
ответ дан 24 November 2019 в 12:16
поделиться
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 и упорядочите по подзапросу (неприятное решение администраторы баз данных ненавидят - но это «работает»)
  4. Используйте пользовательскую функцию, чтобы объединить результаты подзапроса в одну строку
13
ответ дан 24 November 2019 в 12:16
поделиться

Оператор select в части стоимости вашего select возвращает более одного значения. Вам нужно добавить больше предложений where или использовать агрегацию.

6
ответ дан 24 November 2019 в 12:16
поделиться

Исправление состоит в том, чтобы отказаться от использования коррелированных подзапросов и вместо этого использовать объединения. Коррелированные подзапросы - это, по сути, курсоры, поскольку они заставляют запрос выполняться построчно, и их следует избегать.

Вам может потребоваться производная таблица в объединении, чтобы получить нужное значение в поле, если вы хотите, чтобы соответствовала только одна запись, если вам нужны оба значения, тогда обычное соединение сделает это. но вы получите несколько записей для одного и того же идентификатора в наборе результатов. Если вам нужен только один, вам нужно решить, какой из них, и сделать это в коде, вы можете использовать top 1 с порядком по , вы можете использовать max ( ) , вы можете использовать min () и т. Д., В зависимости от ваших реальных требований к данным.

10
ответ дан 24 November 2019 в 12:16
поделиться

Либо ваши данные плохие, либо они не структурированы так, как вы думаете. Возможно и то, и другое.

Чтобы доказать / опровергнуть эту гипотезу, выполните следующий запрос:

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 несколько раз (две отдельные позиции , оба заказывают одну и ту же артикул ).

10
ответ дан 24 November 2019 в 12:16
поделиться

Ошибка означает, что этот подзапрос возвращает более одной строки:

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

Вы, вероятно, не хотите включите таблицы orderdetails и supplier в подзапрос, потому что вы хотите ссылаться на значения, выбранные из этих таблиц во внешнем запросе. Итак, я думаю, вы хотите, чтобы подзапрос был простым:

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

Я предлагаю вам ознакомиться с коррелированными и некоррелированными подзапросами.

4
ответ дан 24 November 2019 в 12:16
поделиться

Как предлагали другие, лучший способ сделать это - использовать соединение вместо присваивания переменной. Переписав свой запрос для использования соединения (и используя синтаксис явного соединения вместо неявного соединения, которое также предлагалось - и это лучшая практика), вы получите что-то вроде этого:

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' 
3
ответ дан 24 November 2019 в 12:16
поделиться