2014-10-29 2 views
0

У меня есть таблица, как показано ниже в SQL Server 2008.Обновление на основе условий в SQL Server с помощью автообъединение

ID| ParentID| InvID |IsIntTr| IsTR 
1 | NULL |  1 | NULL | NULL 
2 |  1 |  2 | NULL | NULL 
3 |  1 |  1 | NULL | NULL 

Мое требование:
Если ParentID населен Сравнить Invid родителя к Invid ребенка , Если они заполнены и они имеют одинаковое значение, тогда установите IsIntTr = 1 и IsTr = 0. В противном случае, установите IsIntTr = NULL и Истр = 1

Else (т.е. ParentID равна нулю)

Set IsIntTr = NULL и Истр = NULL

Я написал запрос на обновление следующих SQL, однако, он делает не работает должным образом:

UPDATE child SET 

IsIntTr = 
    CASE WHEN child.ParentID IS NULL THEN NULL 
     WHEN child.InvID = parent.InvID AND child.ParentID IS NOT NULL 
       THEN 1 ELSE NULL END, 
IsTr  = 
    CASE WHEN child.ParentID IS NULL THEN NULL 
     WHEN child.InvID = parent.InvID AND child.ParentID IS NOT NULL 
       THEN 0 ELSE 1 END 
    from MyTable child (NOLOCK),  
      MyTable parent (NOLOCK) 

Любая помощь очень ценится!

Благодаря

+0

Высказывание _it не работает должным образом. В каком случае вы имеете в виду? – TarasB

+0

, как указано Taras, поскольку предложение where отсутствует, оно только обновило строки, где ID = ParentID – AppDev

ответ

1

Вы были Where отсутствующий в конце.

Попробуйте это:

UPDATE child SET 
IsIntTr = 
    CASE WHEN child.InvID = parent.InvID THEN 1 
     ELSE NULL 
    END, 

IsTr  = 
    CASE WHEN child.InvID = parent.InvID THEN 0 
     ELSE 1 
    END 
from MyTable child (NOLOCK),  
     MyTable parent (NOLOCK) 
WHERE 
    child.ParentId = Parent.Id 

или SqlFiddle.

+0

Привет, спасибо за запрос. Однако я забыл упомянуть, что IsTR и IsIntTR будут иметь начальные значения (1 или 0), а не NULL. Итак, в этом случае, когда я выполняю ваш запрос, он только обновляет, где ParentID не является нулевым и не обновляет (как IsTR, так и IsIntTR) с помощью NULL, где ParentID равен NULL. Так мне нужно 2 обновления? – AppDev

+0

Да, я думаю, вы можете предварительно обработать, установив все столбцы Is- * в 'NULL'. – TarasB

+0

Нет! Я не могу этого сделать ... это предварительно заполненная таблица :-( – AppDev

0

Попробуйте использовать этот

CREATE TABLE #temp 
(
    ID INT IDENTITY(1,1), 
    ParentID INT, 
    InvID INT, 
    IsIntTr INT, 
    IsTR INT 
) 

INSERT INTO #temp 
SELECT NULL, 1, NULL, NULL 
UNION ALL 
SELECT 1, 2, NULL, NULL 
UNION ALL 
SELECT 1, 1, NULL, NULL 

UPDATE #temp SET #temp.IsIntTr = 
    CASE WHEN tbl.InvID_A = tbl.InvID_B THEN 1 ELSE NULL END, 
    #temp.IsTR = CASE WHEN tbl.InvID_A = tbl.InvID_B THEN 0 ELSE 1 END 
FROM (SELECT A.ID, A.ParentID, A.InvID AS InvID_A, B.InvID AS InvID_B, A.IsIntTr, A.IsTR FROM #temp A 
INNER Join #temp B 
ON A.ParentID = B.ID) AS tbl 
WHERE #temp.id = tbl.ID 
+0

Привет, спасибо за запрос. Однако я забыл упомянуть, что IsTR и IsIntTR будут иметь начальные значения (1 или 0), а не NULL. Итак, в этом случае, когда я выполняю ваш запрос, он только обновляет, где ParentID не является нулевым и не обновляет (как IsTR, так и IsIntTR) с помощью NULL, где ParentID равен NULL. Так мне нужно 2 обновления? – AppDev

+0

Да. Вам нужен оператор обновления, где ParentID IS NULL –

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