2015-10-07 3 views
0

Я застрял в этом запросе: Я хотел бы ОБНОВИТЬ каждую строку в таблице temp #tmpHierarchy и установить pLevel = 3, если строка еще не установлена ​​на уровне (= 99), и один из них [возможно] родительские элементы содержатся в таблице темп и имеет уровень = 2.UPDATE WHERE ВозможнаParentItem IN ParentItems

элементов таблицы содержит все элементы, таблица ParentItems содержит ссылки между элементами (поля Пункт, ParentItem)

Что-то вроде:

UPDATE #tmpHierarchy SET pLevel = 3 WHERE pLevel = 99 
     AND (
       (
       SELECT Item FROM Items as IT LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
          WHERE IT.ID = #tmpHierarchy.ItemID 
       ) 
      IN 
       (
       SELECT Item FROM #tmpHierarchy WHERE pLevel = 2 
       ) 
      ) 

Это было бы о том, чего я хочу достичь, bu t он возвращает

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. 

... по очевидной причине, что у меня более чем одно значение в разделе IN (?).

Я был бы рад получить некоторые предложения по этой проблеме.

С уважением,

Дуб

ответ

0

ОК, так что второе условие необходимости модифицировать для INNER JOIN, кажется, дает правильные результаты:

   AND EXISTS (
         SELECT ParItem.ID 
         FROM Items as IT 
         LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
         LEFT JOIN Items as ParItem on ParItem.ID = PTS.ParentItemID 
         INNER JOIN #tmpHierarchy as H ON H.ItemID = ParItem.ID 
         WHERE IT.ItemID = HI.PartNo AND H.pLevel = 2 
         ) 

Я надеюсь, что это помогает будущим зрителям.

Привет Дуб

1

Я уверен, что проблема заключается в том, что часть запроса:

SELECT Item FROM Items as IT LEFT JOIN ParentItems as PTS ON PTS.ItemID = IT.ID 
         WHERE IT.ID = #tmpHierarchy.ItemID 

Это возвращают более одной строки, и вы получите многие ко многим сравнение с не допускается по предложению IN.

Вы можете Ставить запрос на что-то вроде этого:

UPDATE #tmpHierarchy 
SET  pLevel = 3 
WHERE pLevel = 99 
     AND EXISTS (SELECT Item 
        FROM Items AS IT 
          LEFT JOIN ParentItems AS PTS ON PTS.ItemID = IT.ID 
        WHERE IT.ID = #tmpHierarchy.ItemID 
          AND Item IN (SELECT Item 
              FROM  #tmpHierarchy 
              WHERE  pLevel = 2)); 
+0

Да, как я уже писал в этом вопросе, я знаю, что это не будет работать ... Я хотел бы знать, как решить эту проблему. Очевидно, что результат этого конкретного выбора будет возвращать обычно либо NULL, либо 1 элемент, но иногда элемент имеет более одного родителя (несколько макс). Ни в коем случае это большой набор предметов. Но мне нужно обработать это кросс-сравнение в UPDATE. –

+0

Я добавляю исправленный запрос, который должен соответствовать вашим ожиданиям. –

1

Если вы используете IN, левый подзапрос должен быть результатом «одна строка», попробуйте следующее:

UPDATE #tmpHierarchy SET pLevel = 3 WHERE pLevel = 99 
     AND (
      SELECT Item 
      FROM ParentItems as PTS WHERE PTS.ItemID = #tmpHierarchy.ItemID AND 
        #tmpHierarchy.pLevel = 2 
      ) IS NOT NULL 

Я полагаю, что элемент принадлежит ParentItems.

Это мой первый комментарий на сайте, любые советы и жалобы не стесняйтесь делать.

отредактировал: Теперь я вижу, так как SELECT ... pLevel = 99 ... (# tmpHierarchy.pLevel = 2 невозможно), разрешенным владельцем с правильными объединениями в EXISTS.

+0

Я думаю, что в вашем внутреннем запросе отсутствует предложение where. У вас также есть дополнительное ПО, которое необходимо удалить. – BICube

+0

Я думаю, что чего-то не хватает, но это, вероятно, будет направлять меня в правильном направлении. Мне удалось достичь этого с INNER JOIN тем временем ... –

+0

Я отредактировал свой комментарий, изменив ON на WHERE, танки для консультации. –

Смежные вопросы