Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
Здравствуйте, подскажите, пожалуйста, в чём может быть ошибка? Уже несколько раз перепроверил код, менял, всё что было было возможным, но ничего не получилось .
Выдаёт ошибку: "Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано."

INSERT INTO [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB]
           (
            [ACC_MAT_CODE]
           ,[ACC_MAT_NAME]
           ,[ACC_MAT_MARK_NAME]
           ,[ACC_MAT_MARK_NTD]
           ,[ACC_MAT_SORT_NAME]
           ,[ACC_MAT_SORT_NTD]
           ,[DSN_MAT_CODE]
           ,[ACC_MAT_GROUP_NAME]
           ,[ACC_MAT_SUBGROUP_NAME]
)
SELECT
Код 
,Наименование
,Марка 
,(SELECT [Код] 
        FROM [Производство].[dbo].[НТД] 
            WHERE [Ключ] IN
             (SELECT [НТДМарки] FROM [Производство].[dbo].[Материал]
             WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
 
,Сортамент
,(SELECT [Код] 
        FROM [Производство].[dbo].[НТД] 
            WHERE [Ключ] IN
             (SELECT [НТДСортамента]FROM [Производство].[dbo].[Материал]
             WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
,Код
,(SELECT [Наименование]
    FROM [Производство].[dbo].[ГруппаМатериала]
  WHERE Ключ IN (SELECT Группа FROM [Производство].[dbo].[ГруппаМатериала] 
    WHERE [Ключ] IN (SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB]))))
,(SELECT [Наименование]
    FROM [Производство].[dbo].[ГруппаМатериала]
  WHERE Ключ IN (SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
  
  
FROM [Производство].[dbo].[Материал]
  WHERE  
                [Производство].[dbo].[Материал].[Код] NOT IN 
        (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])
1 авг 19, 10:35    [21939570]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Пупырышки
Member [заблокирован]

Откуда:
Сообщений: 635
вестник_про
Здравствуйте, подскажите, пожалуйста, в чём может быть ошибка? Уже несколько раз перепроверил код, менял, всё что было было возможным, но ничего не получилось .
Выдаёт ошибку: "Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано."

INSERT INTO [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB]
           (
            [ACC_MAT_CODE]
           ,[ACC_MAT_NAME]
           ,[ACC_MAT_MARK_NAME]
           ,[ACC_MAT_MARK_NTD]
           ,[ACC_MAT_SORT_NAME]
           ,[ACC_MAT_SORT_NTD]
           ,[DSN_MAT_CODE]
           ,[ACC_MAT_GROUP_NAME]
           ,[ACC_MAT_SUBGROUP_NAME]
)
SELECT
Код 
,Наименование
,Марка 
,(SELECT [Код] 
        FROM [Производство].[dbo].[НТД] 
            WHERE [Ключ] IN
             (SELECT [НТДМарки] FROM [Производство].[dbo].[Материал]
             WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
 
,Сортамент
,(SELECT [Код] 
        FROM [Производство].[dbo].[НТД] 
            WHERE [Ключ] IN
             (SELECT [НТДСортамента]FROM [Производство].[dbo].[Материал]
             WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
,Код
,(SELECT [Наименование]
    FROM [Производство].[dbo].[ГруппаМатериала]
  WHERE Ключ IN (SELECT Группа FROM [Производство].[dbo].[ГруппаМатериала] 
    WHERE [Ключ] IN (SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB]))))
,(SELECT [Наименование]
    FROM [Производство].[dbo].[ГруппаМатериала]
  WHERE Ключ IN (SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])))
  
  
FROM [Производство].[dbo].[Материал]
  WHERE  
                [Производство].[dbo].[Материал].[Код] NOT IN 
        (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


А нахера так писать? Все через Джонни и тогда увидите, где дубль образуется.
1 авг 19, 10:53    [21939587]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
подзапросы возвращают более одной записи
нужно переписать весь запрос, могу только догадываться как
1 авг 19, 10:55    [21939589]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49527

Раз топик в вакансиях, то я "догадаюсь как" за 100 евро.

Posted via ActualForum NNTP Server 1.5

1 авг 19, 11:01    [21939592]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
везде в подзапросах есть код
SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


а внизу в общем условии
[Производство].[dbo].[Материал]
  WHERE  
                [Производство].[dbo].[Материал].[Код] NOT IN 
        (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


обратить внимание в первом на
[Код] IN
во втором на
[Код] NOT IN
это опечатка?
или задумано? какой смысл?
1 авг 19, 11:04    [21939598]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Пупырышки
Member [заблокирован]

Откуда:
Сообщений: 635
letefon
везде в подзапросах есть код
SELECT Группа FROM [Производство].[dbo].[Материал]
         WHERE [Код] IN
             (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


а внизу в общем условии
[Производство].[dbo].[Материал]
  WHERE  
                [Производство].[dbo].[Материал].[Код] NOT IN 
        (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


обратить внимание в первом на
[Код] IN
во втором на
[Код] NOT IN
это опечатка?
или задумано? какой смысл?


С этим у него все норм. Просто фильтр по материалам. Пипец, ну кто так пишет? Код ужасен.

"А чо там эти селекты писать. Это каждый может" (С) какой-то манагер.
1 авг 19, 11:07    [21939602]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
letefon, второе - это чтобы добавились данные, с тем кодом, которого ещё не было, чтобы в итоге таблица без повторений была
1 авг 19, 11:09    [21939606]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
МодальноеОкно
Member

Откуда:
Сообщений: 3648
а вопрос то в чем? написано же in - это подразумевает под собой возможность > 1 строки. может у вас "код" не является PK
1 авг 19, 11:10    [21939607]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
МодальноеОкно, по отдельности куски кода работают, если вместо последней строки написать просто название столбца, без SELECT , но в данном случае так не получилось сделать
1 авг 19, 11:15    [21939612]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Пупырышки
Member [заблокирован]

Откуда:
Сообщений: 635
вестник_про,

это код T-SQL или какой-нить акцесс ?
1 авг 19, 11:19    [21939622]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
вестник_про,
тогда может быть все таки так ?
SELECT
MAT.Код 
,MAT.Наименование
,MAT.Марка 
,NDTMARK.[Код] 
,MAT.Сортамент
,NDTSORT.[Код]
,MAT.Код
,SUBGRMAT.[Наименование],
GRMAT.[Наименование]
FROM [Производство].[dbo].[Материал] as MAT
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as GRMAT ON GRMAT.[Ключ] = MAT.[Группа]
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as SUBGRMAT ON SUBGRMAT.[Ключ] = GRMAT.[Группа]
LEFT JOIN [Производство].[dbo].[НТД] as NDTSORT on NDTSORT.[Ключ] = MAT.[НТДСортамента]
LEFT JOIN [Производство].[dbo].[НТД] as NDTMARK on NDTMARK.[Ключ] = MAT.[НТДМарки]
WHERE MAT.[Код] NOT IN (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])
1 авг 19, 11:21    [21939625]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
Пупырышки, Microsoft SQL Server
1 авг 19, 11:22    [21939629]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 345
Проблема в том, что в ячейку пытаются вставить результат выполнения подзапроса. А он может вернуть несколько значений.
Если там сделать "SELECT TOP 1 [Код] FROM [Производство]" везде - то с ошибкой падать не будет, но будет неправильно работать.
Так-то советую посчитать про строковую агрегацию, какие там есть подходы - это именно тот случай.
1 авг 19, 11:22    [21939630]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
suslupar
Member

Откуда:
Сообщений: 130
Пупырышки
Пипец, ну кто так пишет? Код ужасен.

Это вообще не код.

Похоже, что суть задачи в том, что нужно данные из одной таблички докинуть в другую, попутно дополнив недостающие поля по связанным табличкам. Я только не понял в чем работа, сделать за него или научить пользоваться join и прочим вариантам связки таблиц.
1 авг 19, 11:25    [21939638]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
МодальноеОкно
Member

Откуда:
Сообщений: 3648
Пупырышки
вестник_про,

это код T-SQL или какой-нить акцесс ?


это вьюхи к базе на mssql с русскими именами. возможно даже исходная база - 1с
1 авг 19, 11:25    [21939639]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
МодальноеОкно, это по летней практике, создал базы и таблицы, имена писал на русском, чтобы не запутаться, насчёт JOIN знаний мало, поэтому решал таким не самым приличным кодом реализовать заполнение таблиц
1 авг 19, 11:32    [21939654]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
suslupar
Member

Откуда:
Сообщений: 130
вестник_про,

Вы как собрались с базами данных работать, не понимая элементарных связок таблиц? Это тема чуть ли не для первых занятий по теории БД.
1 авг 19, 11:39    [21939664]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
запрос пробовали выполнить? оно или не оно?

letefon
вестник_про,
тогда может быть все таки так ?
SELECT
MAT.Код 
,MAT.Наименование
,MAT.Марка 
,NDTMARK.[Код] 
,MAT.Сортамент
,NDTSORT.[Код]
,MAT.Код
,SUBGRMAT.[Наименование],
GRMAT.[Наименование]
FROM [Производство].[dbo].[Материал] as MAT
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as GRMAT ON GRMAT.[Ключ] = MAT.[Группа]
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as SUBGRMAT ON SUBGRMAT.[Ключ] = GRMAT.[Группа]
LEFT JOIN [Производство].[dbo].[НТД] as NDTSORT on NDTSORT.[Ключ] = MAT.[НТДСортамента]
LEFT JOIN [Производство].[dbo].[НТД] as NDTMARK on NDTMARK.[Ключ] = MAT.[НТДМарки]
WHERE MAT.[Код] NOT IN (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])
1 авг 19, 11:39    [21939666]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
letefon, спасибо большое, я пока изучаю Ваш код, потому что не особо понимаю
1 авг 19, 11:41    [21939671]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
вестник_про
Member

Откуда:
Сообщений: 7
letefon, Вы гений, код безупречно сработал, а то свой я создавал около часа, ещё 2-3 часа не мог понять, как исправить. Как я могу Вас отблагодарить? У меня есть на вемани накопления, либо на телефон Вам скинуть ?

Модератор: Тема перенесена из форума "Вакансии".


Сообщение было отредактировано: 1 авг 19, 12:05
1 авг 19, 11:58    [21939705]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
вестник_про
код безупречно сработал

не факт, я не знаю точную логику, пытался максимально приблизить к предполагаемому результату
запросе используется LEFT JOIN, а возможно правильно где-то или везде нужно INNER JOIN
зависит от обязательности заполнения ссылок на ключевые поля
1 авг 19, 12:11    [21939715]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Пупырышки
Member [заблокирован]

Откуда:
Сообщений: 635
letefon
запрос пробовали выполнить? оно или не оно?

letefon
вестник_про,
тогда может быть все таки так ?
SELECT
MAT.Код 
,MAT.Наименование
,MAT.Марка 
,NDTMARK.[Код] 
,MAT.Сортамент
,NDTSORT.[Код]
,MAT.Код
,SUBGRMAT.[Наименование],
GRMAT.[Наименование]
FROM [Производство].[dbo].[Материал] as MAT
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as GRMAT ON GRMAT.[Ключ] = MAT.[Группа]
LEFT JOIN [Производство].[dbo].[ГруппаМатериала] as SUBGRMAT ON SUBGRMAT.[Ключ] = GRMAT.[Группа]
LEFT JOIN [Производство].[dbo].[НТД] as NDTSORT on NDTSORT.[Ключ] = MAT.[НТДСортамента]
LEFT JOIN [Производство].[dbo].[НТД] as NDTMARK on NDTMARK.[Ключ] = MAT.[НТДМарки]
WHERE MAT.[Код] NOT IN (SELECT [ACC_MAT_CODE] FROM [COMMON_BUFFER].[dbo].[ACC_MATERIALS_RFB])


А почему not in не вынести в джойн и потом сравнивать на IS NULL ?
1 авг 19, 12:43    [21939742]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
letefon
Member

Откуда:
Сообщений: 128
Пупырышки
letefon
запрос пробовали выполнить? оно или не оно?

пропущено...


А почему not in не вынести в джойн и потом сравнивать на IS NULL ?

можно и вынести
это не окончательный вариант, а попытка дать направление
1 авг 19, 13:35    [21939821]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Art_Serge
Member

Откуда:
Сообщений: 46
letefon, попробуйте решить задачу на "каком-нибудь" Access. Сразу культура создания sql на порядок улучшится. Ну и про теорию не забудьте.
1 авг 19, 14:37    [21939905]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Art_Serge
Member

Откуда:
Сообщений: 46
Art_Serge, это относится к "вестник_про "
1 авг 19, 14:38    [21939908]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить