-
Кстати, о стандартах:
"Хотя большинство комитетов по стандартам, как правило, создают нечто ужасное, стандарт 1003.1 заметно отличается от общего правила в лучшую сторону....
Документ 1003.1 написан так, чтобы как разработчики операционной системы, так и создатели программного обеспечения были способны его понять, что также ново в мире стандартов, хотя в настоящее время уже полным ходом ведется работа по исправлению этого нестандартного для стандартов свойства."
(с) Эндрю Таненбаум
-
> Игорь Шевченко © (18.05.09 22:33) [19]
Предложи другой вариант синтаксиса, где источников для обновления больше одного и они не только простые таблицы, но соединения, при том множественные на одну и туже таблицу. Ведь все равно придется придумывать какой то синтаксис, пускай без естественного FROM
Вот выписка из справки
> Определяет, что для определения критериев операции обновления > используется таблица, представление или производный источник > таблицы. Дополнительные сведения см. в разделе FROM (Transact- > SQL). > > Если обновляемый объект тот же самый, что и объект в предложении > FROM, и в предложении FROM имеется только одна ссылка на > этот объект, псевдоним объекта указывать необязательно. > Если обновляемый объект встречается в предложении FROM несколько > раз, одна и только одна ссылка на этот объект не должна > указывать псевдоним таблицы. Все остальные ссылки на объект > в предложении FROM должны включать псевдоним объекта.
А вот дополнение
> Указывает таблицы, представления, производные таблицы и > соединяемые таблицы, которые используются в инструкциях > DELETE, SELECT и UPDATE. В инструкции SELECT требуется предложение > FROM, за исключением тех случаев, когда список выбора содержит > только константы, переменные и арифметические выражения > (без имен столбцов).
-
Я сегодня с утра так немного подумал... Вобщем, у Юрия условие какое-то странное.
T1.K11 = T2.K21
and
T1.K12 = T2.K22
and
T2.F2 = 'НЕЧТО'
'НЕЧТО' - избыточное условие, и так всё сработает (в случае, когда таких сочетаний больше нуля). Либо надо что-то типа
T1.K11 = T2.K21
and
T1.K12 = T2.K22
and
T1.F1=T2.F2
and
T2.F2 = 'НЕЧТО'
-
> Предложи другой вариант синтаксиса
собственно в самом начале предложил
-
> Ega23 © (19.05.09 10:16) [22]
Что-то я не понял, почему условие лишнее. Надо обновить только те записи T1, которые после соединения (один к одному) дают T2.F2 = 'НЕЧТО' Как же можно этого добиться без указания 'НЕЧТО'
-
> Что-то я не понял, почему условие лишнее.
Всё нормально, я уже уточнил условие. Просто я [0] не так понял. [22] - снято.
-
> собственно в самом начале предложил
Если ты имеешь в виду [1] и [2], то не вижу
-
Anatoly Podgoretsky © (19.05.09 11:54) [26]
> Если ты имеешь в виду [1] и [2], то не вижу
> Предложи другой вариант синтаксиса, где источников для обновления > больше одного и они не только простые таблицы, но соединения, > при том множественные на одну и туже таблицу.
Переведи пожалуйста эту фразу. Я не понимаю, что имеется в виду - одним UPDATE изменять несколько таблиц или изменять одну таблицу, но критерией для отбора записей для изменения является N таблиц ? Во втором случае - [1] или [2].
-
> Игорь Шевченко (19.05.2009 12:04:27) [27]
set f1=t2.f1, f2=t3.f2,... fN=tN.fN где tX - это или просто таблицы, или представления, или соединения с другими таблицами по JOIN при том возможно несколько соединений с одной и той же таблицей. где количество источников столько сколько нужно и нет ограничения на тип и без вложеных запросов. Вот для этого и нужно ключевое слово FROM что бы можно было создать и использовать алиасы для указания источника. Или другими словами справа может быть любая структура допустимая для SELECT ... FROM список источников.
-
> set f1=t2.f1, f2=t3.f2,... fN=tN.fN > где tX - это или просто таблицы, или представления, или > соединения с другими таблицами по JOIN при том возможно > несколько соединений с одной и той же таблицей. > где количество источников столько сколько нужно и нет ограничения > на тип и без вложеных запросов. Вот для этого и нужно ключевое > слово FROM что бы можно было создать и использовать алиасы > для указания источника. Или другими словами справа может > быть любая структура допустимая для SELECT ... FROM список > источников.
В этом случае гораздо проще использовать UPDATE ... WHERE CURRENT OF
-
> Игорь Шевченко (19.05.2009 14:13:29) [29]
Может быть и так, но это синтаксис Оракла и я не уверен на присутствие в стандарте или в других SQL серверах, в T-SQL этого формата нет и я даже не представляю ее синтаксиса.
-
> В этом случае гораздо проще использовать UPDATE ... WHERE CURRENT OF проще? объединение с курсором и правилами объединения описанными где то "в стороне", да это имхо еще более неявно чем неявное объединение... для примера, кто не в курсе http://www.techonthenet.com/oracle/cursors/current_of.phpну или покажи на примере аналог запроса из [12] с CURRENT OF, так чтобы он был проще для восприятия. p.s. это в тебе просто говорит неприятие нового, а не реальное знание, что что-то проще.
-
> но это синтаксис Оракла был рожден в оракле и помрет в нем же, а если бы это было реально удобнее и проще то давно бы уже повторили, а может и стандартом сделали. ведь довольно старая конструкция, время осмыслить было.
-
> в T-SQL этого формата нет и я даже не представляю ее синтаксиса.
Чё-это нет-то сразу? Использование инструкции UPDATE с предложением FROM Результаты инструкции UPDATE не определены, если инструкция включает предложение FROM, в котором для каждого вхождения обновляемого столбца не задано единственное значение, то есть если инструкция UPDATE не является детерминированной. Например, в инструкции UPDATE следующего сценария обе строки в Table1 удовлетворяют условиям предложения FROM в инструкции UPDATE, но не определено, какая строка из Table1 используется для обновления строки в Table2. USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1
(ColA int NOT NULL, ColB decimal(10,3) NOT NULL);
GO
CREATE TABLE dbo.Table2
(ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES(1, 10.0);
INSERT INTO dbo.Table1 VALUES(1, 20.0);
INSERT INTO dbo.Table2 VALUES(1, 0.0);
GO
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);
GO
SELECT ColA, ColB
FROM dbo.Table2;
То же самое может произойти при сочетании предложений FROM и WHERE CURRENT OF. В следующем примере обе строки в Table2 удовлетворяют условиям предложения FROM в инструкции UPDATE. Не определено, какая строка из Table2 должна использоваться для обновления строки в Table1. USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1
(c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);
GO
CREATE TABLE dbo.Table2
(d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES (1, 10);
INSERT INTO dbo.Table2 VALUES (1, 20);
INSERT INTO dbo.Table2 VALUES (2, 30);
GO
DECLARE abc CURSOR LOCAL FOR
SELECT c1, c2
FROM dbo.Table1;
OPEN abc;
FETCH abc;
UPDATE dbo.Table1
SET c2 = c2 + d2
FROM dbo.Table2
WHERE CURRENT OF abc;
GO
SELECT c1, c2 FROM dbo.Table1;
GO
Только курсор для этого ещё открывать - некузяво как-то для T-SQL
-
Anatoly Podgoretsky © (19.05.09 14:29) [30]
> Может быть и так, но это синтаксис Оракла и я не уверен > на присутствие в стандарте
Вообще-то это синтаксис SQL-92
sniknik © (19.05.09 14:35) [31]
> p.s. это в тебе просто говорит неприятие нового, а не реальное > знание, что что-то проще.
Безусловно. Если ты читаешь внимательно, то увидишь, что я говорю исключительно о своем впечатлении. Надеюсь, на этой благостной ноте мы закончим дискуссию.
P.S. Я еще использую синтаксис с (+) вместо OUTER JOIN в силу присущего мне консерватизма.
-
> sniknik © (18.05.09 21:59) [18]
> думаешь их придумывают совсем неграмотные?
ну почему, минимум писАть умеют.
> P.S. Я еще использую синтаксис с (+) вместо OUTER JOIN в > силу присущего мне консерватизма.
а я думал, потому что букаф меньше и запрос читабельней
-
> и запрос читабельней
Ой, Петь, это крайне спорный вопрос насчет читабельности. Я конечно понимаю, что в чужой монастырь (Oracle, Postgres, MSSQL или ещё что-нибудь) со своим уставом соваться не положено, но Outer Join - он даже в Access Outer Join. А вот (+) - далеко не везде... :)
-
update с from штука удобная, я пользовался ей в MS SQL. В оракле ее нету. Но в оракле можно прекрасно обойтись и без оной - либо через IN либо через пл/скл скрипт. А вот в MS SQL скрипт писать с курсором запаришься, да и курсоры в нем хреново реализованы (о чем написано в BOL), посему, видимо, и реализовали апдейт с фромом.
-
> Ой, Петь, это крайне спорный вопрос насчет читабельности. > Я конечно понимаю, что в чужой монастырь (Oracle, Postgres, > MSSQL или ещё что-нибудь) со своим уставом соваться не > положено, но Outer Join - он даже в Access Outer Join. А > вот (+) - далеко не везде... :)
Ну и что, что не везде. Один хрен, попытка писать запросы так, чтобы выполнялись на всех СУБД - полностью бестолковая затея. Зато с (+) на оракле и читать удобнее и писать меньше.
-
если считать, что читабельнее то где меньше букв, то надо признать что perl самый понятный язык, причем в самой его "жесткой" форме, когда в строчку умещается целая программа. (а еще круче если перл скрипт выполняется прям из архива, архив будет прям эталоном читабельности... и проще всего прямо в его кодах и писать) и C на порядок понятнее дельфей (ну как же вместо begin (6) пишут { (1), и т.д.).
|