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

Откуда:
Сообщений: 34
есть две таблицы:

Column1 |
1А |
2А |
3А |
4А |

Column1 | Column2
1A | 1B
2A | 2B
3A | 3B
4A | 4B

Необходимо заменить значение column1.Table1 на column2.Table2 при условии что column1.Table1 = Column1.Table2

написал два скрипта и оба не работают:

1.

UPDATE Table1
SET Column1 = (select top 1 Table2.Column2 FROM Table2 WHERE Table1.Column1 = Table2.Column1 )

2.

UPDATE Table2
SET Table1.Column1 = Table2.Column2
FROM Table1
LEFT OUTER JOIN Table2
ON Table1.Column1 = Table2.Column1


ничего не находит, т.е. ошибка такова:

Cannot insert the value NULL into column 'Column1', table 'Table2'; column does not allow nulls. UPDATE fails.
The statement has been terminated.

простой скрипт, но ничего не получается!
31 авг 11, 08:55    [11204158]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
dt.venom, а вы читать сообщение об ошибке не пробовали? Можно с переводчиком, если с английским проблемы. Попробуйте, поможет.
31 авг 11, 09:00    [11204169]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
UPDATE  u
SET     Column1 = t2.Column2 --isnull(t2.Column2,0)
FROM    Table1 u
JOIN    Table2 t2
ON      u.Column1 = t2.Column1
31 авг 11, 09:05    [11204182]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
dt.venom
Member

Откуда:
Сообщений: 34
большое спасибо за развернутый ответ :D к сожалению англ. у меня 3 язык и он пока на уровне "advance"

а если серьезно:

суть в том что значения NULL там никак физически не может быть, потому что все значения table1.column1 дублируются table2.column1 . Это меня и смутило!

вообщем оказалось что "LEFT OUTER JOIN" в моем 2 примере излишен и не логичен, как только изменил на просто "JOIN" все заработало!

иными словами спасибо!
31 авг 11, 09:24    [11204223]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
iljy
Member

Откуда:
Сообщений: 8711
dt.venom
суть в том что значения NULL там никак физически не может быть, потому что все значения table1.column1 дублируются table2.column1 . Это меня и смутило!

Видите ли в чем дело... Сервер не имеет привычки врать. Выполните
SELECT Column1 FROM Table1
   EXCEPT
SELECT Column1 FROM Table2
31 авг 11, 09:33    [11204249]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
iljy,
а что делать если возникла ошибка?
при расписаний апдейта?
UPDATE table1 c SET (c.gr, c.gritem, c.grelitem) =
	(SELECT col1, col2, col3 
	FROM table2 d
	WHERE procubeMeter=146 
	AND (SELECT Count(id) FROM FactFProCubeMeter WHERE DataFProcubeMeter=d.id 
	AND Itemprocubemeter IN (c.colHz_2))=1)
	WHERE c.id<>0
Сообщение 102, уровень 15, состояние 1, строка 1
Неправильный синтаксис около конструкции "c".
Сообщение 156, уровень 15, состояние 1, строка 7
Неправильный синтаксис около ключевого слова "WHERE".
19 сен 11, 16:37    [11299794]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Сообщение 102, уровень 15, состояние 1, строка 1
Неправильный синтаксис около конструкции "c".
Сообщение 156, уровень 15, состояние 1, строка 7
Неправильный синтаксис около ключевого слова "WHERE".

Изучить синтакис, а не придумывать его самому
19 сен 11, 16:44    [11299863]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
UPDATE CUBEM_151 SET gr = (SELECT GrMeter
	FROM Datafprocubemeter dfpmt 
	WHERE procubeMeter=146 
	AND (SELECT Count(id) FROM FactFProCubeMeter WHERE DataFProcubeMeter=dfpmt.id 
	AND Itemprocubemeter IN (Item_2)) = 1), gritem = (SELECT GrMeterItem
	FROM Datafprocubemeter dfpmt 
	WHERE procubeMeter=146 
	AND (SELECT Count(id) FROM FactFProCubeMeter WHERE DataFProcubeMeter=dfpmt.id 
	AND Itemprocubemeter IN (Item_2)) = 1), grelitem = (SELECT Grmeterrateitem 
	FROM Datafprocubemeter dfpmt 
	WHERE procubeMeter=146 
	AND (SELECT Count(id) FROM FactFProCubeMeter WHERE DataFProcubeMeter=dfpmt.id 
	AND Itemprocubemeter IN (Item_2)) = 1)
	WHERE id<>0
так то она выполняется. Но время выполнения увеличивается. 3 запроса вместо 1. А как сделать 1 запросом? Курсор тоже долго.
19 сен 11, 17:34    [11300406]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
UPDATE Table1
SET Table1.Column2 = Table2.Column2,
Table1.Column3 = Table2.Column3,
Table1.Column4 = Table2.Column4
FROM Table1
LEFT OUTER JOIN Table2
ON Table1.Column1 = Table2.Column1

интересно, как вы там в Оракле элементарные запросы то писали ? Все через курсоры что ли ?

Сообщение было отредактировано: 19 сен 11, 17:39
19 сен 11, 17:39    [11300457]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
sqlsFrom:='update '||cubetable||' c set c.';
  sqlsFrom2:='from Datafprocubemeter dfpmt where procubeMeter='||
  to_char(crsCubeList.Procubemeter)||' and 
  (select Count(id) from FactFProCubeMeter where DataFProcubeMeter=dfpmt.id and Itemprocubemeter in (';
  sqlsFrom2:=sqlsFrom2||sqldofrom||'))='||to_char(i-2)||')';

-- заполнение полей: группа измерителей, измерители в группе,показатели в группе
  sqltable:= 'update '||cubetable||' c set (c.gr, c.gritem, c.grelitem) =(select GrMeter, GrMeterItem, Grmeterrateitem '
  ||sqlsfrom2||' where c.id<>0';
  execute immediate sqltable;
  commit;
19 сен 11, 17:48    [11300561]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Apikaster,
Там все проще :)
19 сен 11, 17:48    [11300570]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Там все проще :)

Вот этот "паровоз" из 5 команд вместо одной вы называете проще ?
19 сен 11, 17:50    [11300594]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
Ну а как вы посоветуете?
Просто я делал теми методами к которым я привык.
Но записей в таблица у меня много.
И вся процедура оракле это все выполняется 1 сек.
А есть вариант сделать это быстрее?
19 сен 11, 17:54    [11300644]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Просто я делал теми методами к которым я привык.

В этом и проблема

Apikaster
Ну а как вы посоветуете?

Не писать на TSQL код эмулирующий код Оракла
19 сен 11, 17:57    [11300677]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
А exists читает вюшки?
19 сен 11, 18:42    [11301028]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
опарышей - под язык
Guest
Apikaster
Glory,
А exists читает вюшки?

смотря чем прикармливаешь.
19 сен 11, 19:09    [11301180]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Glory,
А exists читает вюшки?

exists ничего не читает
Хотя возможно в Оракл понятие "читает" отличается от MSSQL
19 сен 11, 19:12    [11301201]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
Где я допустил ошибку?
UPDATE Table_1 SET 
	measurefict = (SELECT value FROM vwView2 dm -- вюшка с которым считываются значения
	WHERE dm.own=Own 
	AND dm.isRel=isRel 
	AND dm.CharGr=chargr 
	AND dm.gritem=gritem 
	AND dm.grelitem=grelitem 
	AND dm.period=period)
	WHERE EXISTS (SELECT id FROM vwView_1 vw -- это вюшка в которой хранятся данные, и есть значения, то он должен их вписать по скольку возвращает тру
	WHERE vw.own=own 
	AND vw.isRel=isrel 
	AND vw.CharGr=chargr 
	AND vw.gritem=gritem 
	AND vw.grelitem=grelitem 
	AND vw.period=period)
А у меня ошибка.
Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.
20 сен 11, 10:37    [11303125]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
В vwView_1 я до этого забил данными.
20 сен 11, 10:41    [11303158]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Где я допустил ошибку?

Вы сообщения сервера принципиально не читаете ?
20 сен 11, 10:45    [11303172]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
Я понял системное сообщение.
Но как его обойти?
20 сен 11, 10:49    [11303223]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
Я понял системное сообщение.
Но как его обойти?

Наверное сделать так, чтобы не было, что "Вложенный запрос вернул больше одного значения"
Неужели это так неочевидно ?
Или в Оракле можно в один столбец занести сразу набор весь результат запроса ?
20 сен 11, 10:56    [11303273]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Glory,
там можно больше )) можно сет и через запятую два поля указать и 1 запрос с 2 полями по которым он должен пробежаться
и в iddata, measurefict записать сколько угодно значений из запроса в котором вписано id, val. И того же результата я не могу добиться и у MSSQL )) Мне уже самому стыдно что я вас так достаю )) Но честно. Мне это очень нужно.
update table_1 c set(c.iddata, c.measurefict) = (select id, val from vwDataMeter 
where own=c.own 
and isRel=c.isrel 
and CharGr=c.chargr 
and gritem=c.gritem 
and grelitem=c.grelitem 
and period=c.period) 
where exists (select id from vwView_1 
where own=c.own and isRel=c.isrel 
and CharGr=c.chargr 
and gritem=c.gritem 
and grelitem=c.grelitem 
and period=c.period)
20 сен 11, 11:10    [11303409]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Apikaster
и в iddata, measurefict записать сколько угодно значений из запроса в котором вписано id, val.

И как же физически в одном поле одной записи размещается набор скажем из 100 000 записей, что вернет подзапрос ?
20 сен 11, 11:12    [11303429]     Ответить | Цитировать Сообщить модератору
 Re: update c взятием данных из другой таблицы.  [new]
Apikaster
Member

Откуда:
Сообщений: 51
Apikaster,
И записываются в итоге не все значения а каждая в отдельный столбец и каждый проверяется. В MSSQL неужели нельзя обойтись без цикла? или чего то такого что бы увеличило время выполнения запроса?
Значения записываются не в одну сточку а в каждый столбец в котором условия выполняются.
20 сен 11, 11:13    [11303438]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить