powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие...
82 сообщений из 82, показаны все 4 страниц
Сравнительный анализ MS Sql и другие...
    #32386551
Michael BAG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пытаюсь разобраться со всевозможными РСУБД и понять, что лучше использовать да работы с ОЧЕНЬ сложной структурой объектной классификации...
Интересует следующий вопрос.
Чем лухше (хуже) Microsoft SQL 2000 чем другие субдешки?
(Postgre, SyBase, InterBase, MaxDB by MySQL, InferMix и еще че-нть)

Интересуют ценовые, функциональные, скоростные аспекты и области применени тех или иных баз.

Все, что я пока понимаю, так это то, что MS SQL весьма похошь (сродни) с Sybase'ом, и InterBase их в некоторых принципиальных вопросах зранения самих баз "обходит".

На самом деле можно воспринимать вопрос как анализ всех РСУБД.

Помогите. На самом деле очень нужна ваша помощь.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32386555
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, что я пока понимаю, так это то, что MS SQL весьма похошь (сродни) с Sybase'ом, и InterBase их в некоторых принципиальных вопросах зранения самих баз "обходит".

Страшно интересно - это в каких еще и "принципиальных вопросах" Interbase их обходит? :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32386610
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я даже и не знаю, чего тут сказать, когда нужно сравнивать с InterBase, MaxDB by MySQL, InferMix и еще че-нть - я из них даже гнекоторые и не слышал.

ЗЫ Как сравнить трактор и сенокосилку??????

-- Tygra's --
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32386664
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--что лучше использовать да работы с ОЧЕНЬ сложной структурой объектной классификации...

насколько сложной ?

теоритически да и прктически любую сложную структуру можно свернуть в одну таблицу
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32387509
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте на MS SQL реализовать подобное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
 --------------------------------------------------------
 
 --  ItemID		Код узла дерева
 
 --  ParentID	Родительский элемент
 
 --  Name		Наименование узла
 
 --------------------------------------------------------
 
CREATE TABLE dict.Dict (
    ItemID	INTEGER	NOT NULL,
    ParentID	INTEGER,
    Name	CHAR( 35 ),
    constraint  AtParent CHECK (ParentID<>ItemID),
    constraint  AtItemID PRIMARY KEY (ItemID)
)
@

CREATE UNIQUE INDEX dict.IDict ON dict.Dict (Name) ALLOW REVERSE SCANS
@
CREATE UNIQUE INDEX dict.IDictParent ON dict.Dict (ParentID,ItemID)
@

 ----------------------------------------------
 
 -- Запрещаем ссылку на несуществующие записи
 
 -- при обновлении ParentID
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BUDictParent
NO CASCADE BEFORE UPDATE ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (
	(N.ParentID IS NOT NULL)
    AND ((SELECT P.ItemID FROM dict.Dict P WHERE P.ItemID=N.ParentID) IS NULL)
)	SIGNAL SQLSTATE '75011' ('Несуществующий ParentID')
@

 ----------------------------------------------
 
 -- Защита от рекурсивного зацикливания
 
 -- при обновлении ParentID
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BUDict
NO CASCADE BEFORE UPDATE ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WITH Lvl (TopItemID,ItemID,ParentID)
AS (
	SELECT bottom.ItemID,bottom.ItemID,bottom.ParentID
		FROM dict.Dict AS bottom
	        WHERE bottom.ItemID=N.ParentID
	UNION ALL
	SELECT Lvl.TopItemID,parent.ItemID,parent.ParentID
    	FROM Lvl, dict.Dict AS parent
	        WHERE parent.ItemID=Lvl.ParentID
            	AND Lvl.ParentID<>Lvl.TopItemID
)
SELECT
    CASE 
    	WHEN Lvl.ParentID=N.ItemID THEN RAISE_ERROR('70021','Рекурсивное зацикливание')
        ELSE Lvl.ParentID
    END
FROM Lvl 
@

 ----------------------------------------------
 
 -- Запрещаем ссылку на несуществующие записи
 
 -- при добавлении новой записи
 
 -- Побочный эффект - не позволяет строить
 
 -- дерево в одной транзакции
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BIDictParentID
NO CASCADE BEFORE INSERT ON dict.Dict
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (
	(N.ParentID IS NOT NULL)
    AND ((SELECT P.ItemID FROM dict.Dict P WHERE P.ItemID=N.ParentID) IS NULL)
) SIGNAL SQLSTATE '75011' ('Несуществующий ParentID')
@


 ----------------------------------------------
 
 -- Запрещаем удаление родительского узла
 
 ----------------------------------------------
 
CREATE TRIGGER dict.BDDict
NO CASCADE BEFORE DELETE ON dict.Dict
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN (
(SELECT COUNT(*) FROM dict.Dict D
	WHERE D.ParentID=O.ItemID)> 0 
) SIGNAL SQLSTATE '75031' ('Существуют ссылки на узел')
@



insert into dict.Dict (ItemID,ParentID,Name) values ( 1 ,NULL,'root')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 2 , 1 ,'Два')				@
insert into dict.Dict (ItemID,ParentID,Name) values ( 3 , 1 ,'Три')				@
insert into dict.Dict (ItemID,ParentID,Name) values ( 4 , 1 ,'Четыре')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 5 , 2 ,'Пять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 6 , 2 ,'Шесть')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 7 , 3 ,'Семь')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 8 , 3 ,'Восемь')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 9 , 3 ,'Девять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 10 , 6 ,'Десять')			@
insert into dict.Dict (ItemID,ParentID,Name) values ( 11 , 6 ,'Одиннадцать')	@
insert into dict.Dict (ItemID,ParentID,Name) values ( 12 , 9 ,'Двенадцать')		@
insert into dict.Dict (ItemID,ParentID,Name) values ( 13 , 12 ,'Тринадцать')	@
insert into dict.Dict (ItemID,ParentID,Name) values ( 14 , 13 ,'Четырнадцать')	@
@

 -----------------------------------------------------
 
 --
 
 --  1--+--2---------+--5
 
 --     |            |
 
 --     +--3--+--7   +--6--+--10
 
 --     |     |            |
 
 --     +--4  +--8         +--11
 
 --           |
 
 --           +--9--12--13--14
 
 --
 
 --
 
 ----------------------------------------------------
 

select * from dict.Dict@






Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 --Выбор всех предков для опции
 
with Node (ItemId,ParentId,Name,Cnt)
as (
	select child.ItemId,child.ParentId,child.Name, 0 
	    from dict.Dict child
		    where child.ItemId= 13 

	union all
   		select parent.ItemId,parent.ParentId,parent.Name,node.Cnt+ 1 
        	from dict.Dict parent, node 
            where parent.ItemId=node.ParentID )

select * from Node order by Cnt desc
@

 --Определение уровня вложеннности для узла
 
with Lvl (Level,ParentID) 
as (
	select  0 ,ParentID
    	from dict.Dict bottom
        	where ItemID= 1 

    union all

	select Lvl.Level+ 1 ,parent.ParentID from dict.Dict parent,Lvl
    	where parent.ItemID=Lvl.ParentID )
select count(*) from Lvl
@

...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32387604
f_w_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страшно интересно - это в каких еще и "принципиальных вопросах" Interbase их обходит? :)
Ну навскидку:
FireBird
- Версионник
- Имеет такой тип данных как ARRAY
- Имеет такую фичу как EVENT
- Многоплатформенный
- Бесплатный
Зато
MSSQL
- Блокировочник
- Имеет отличный оптимизатор запросов
- лучше держит большое количество коннектов
- Имеет более продвинутый T-SQL

и т.д.
По-моему это уже было:-))).
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388207
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman
попробуйте на MS SQL реализовать подобное:

Триггера - реализуемы. Некоторые как after, некоторые как instead (честно говоря толком не смотрел, какие как кто). Один - просто FK, как я понял.
Рекурсивные выборки - как table UDF. Согласен, не так изящно, но реализуемо :-)
Кста, некоторые триггера можно и несколько эффективнее написать (при проверке на невозможность удаления родительского узла нет необходимости считать к-во дочерних узлов, надо просто узнать, есть ли хоть один, но, возможно, это просто осбенность реализации приведенного триггера).
И, насколько я понял, в MS SQL можно построить дерево в одной транзакции.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388240
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Кста, некоторые триггера можно и несколько эффективнее написать (при проверке на невозможность удаления родительского узла нет необходимости считать к-во дочерних узлов, надо просто узнать, есть ли хоть один, но, возможно, это просто осбенность реализации приведенного триггера).

- вот с этим согласиться можно...
А вот как быть с триггерами for each row?

триггеры - insted of - эт вааще - отстой. Они на вьюшках, и работают медленнее.

>И, насколько я понял, в MS SQL можно построить дерево в одной транзакции
хм...) Хорошее заявление...)) конечно можно, если сначала отменить действие триггеров а потом вставить)) - но это абсолютно неправильно.
Вообще, вставлять узлы пачками я бы не стал... мало ли чего можно в пачке накатать.

А как насчет промежуточных группировок GROUPINGSET? а операторы CUBE ROLLUP?

Но факт есть факт - реализация языка запросов для MS SQL отстает от DB2 и ORACLE очень сильно. Да и вообще в базах данных ток IBM и Oracle разбираются...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388271
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for each row - ручками, открываем курсор по inserted/deleted и вперёд :-)
instead of - он и для табличек тоже, насколько я знаю. Насчет скорости - не имею понятия, триггера использовал только пару раз (у меня к ним стойкое предубеждение сложилось в 6.5, а затем пообвыкся без них. Сейчас, говорят, всё значительно лучше).
По поводу GROUPINGSET и CUBE ROLLUP - это о чем мы?

А ежели брать конкретную задачу, как то:
1. Запретить зацикливание
2. Запретить ссылаться на несуществующую запись
3. Запретить удалять предка, у которого есть доченрние записи.
4. Получить полный путь узла.
5. Получить вложенность
То это реализуется 1 FK(защита от ссылок на несуществующие записи), 1-м триггером(защита от зацикливания), и 2-мя функциями (получение списка предков и получение вложенности).
Для пущего понту можно организовать уровень вложенности как computed column в таблице :-) Правда, не рекомендую всё-же...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388380
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman -- Запрещаем ссылку на несуществующие записи
-- при добавлении новой записи
-- Побочный эффект - не позволяет строить
-- дерево в одной транзакции
А вот были бы триггеры - insted of - можно было бы и в одной транзакции сделать, но вот нельзя в Оракле реализовать подобное :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388395
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и делается это без всякой отмены действий триггеров - на то они и insted , что работают вместо действия.

А что касается триггеров for each row - и хорошо что их нет. Надо с данными работать, а не с записями.

Трудно удержаться:
Но факт есть факт - реализация языка запросов для ORACLE отстает от MS SQL очень сильно. Да и вообще в базах данных ток MS разбирается...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388459
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
не хочу расстраивать но тригеры insted of в оракле очень давно ...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388478
s79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s79
Гость
SergSuper\r
Трудно удержаться: \r
Но факт есть факт - реализация языка запросов для ORACLE отстает от MS SQL очень сильно. Да и вообще в базах данных ток MS разбирается...\r
\r
Давно я так не смеялся. Класная шутка. \r
А если это не шутка. то /topic/60927 и последние страницы читать вдумчиво.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388601
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman А вот как быть с триггерами for each row? Курсор, только у меня почему-то 95% триггеров работает без курсоров :( Как быть? :))

gardenman триггеры - insted of - эт вааще - отстой. Они на вьюшках, и работают медленнее.Работают они и на таблицах, а почему отстой, почему медленнее?

gardenman А как насчет промежуточных группировок GROUPINGSET?Просвети, что это такое - возможно есть решение.

gardenman а операторы CUBE ROLLUP? ROLLUP есть и MS SQL

gardenman Но факт есть факт - реализация языка запросов для MS SQL отстает от DB2 и ORACLE очень сильно. Да и вообще в базах данных ток IBM и Oracle разбираютсяВ приведенной чуть выше ссылке уже был один, который даже тему не прочитал :))
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388732
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky > 5. Получить вложенность
То это реализуется 1 FK(защита от ссылок на несуществующие записи), 1-м триггером(защита от зацикливания), и 2-мя функциями (получение списка предков и получение вложенности).
Для пущего понту можно организовать уровень вложенности как computed column в таблице :-) Правда, не рекомендую всё-же...


Внешний ключ?... хорошо подумал? Ну ты совсем не Штирлиц)))
Штирлиц подумал , ему понравилось, и он подумал еще раз...))
учись у Штирлица)

FK в таблице на саму себя?..) Я праильно понял? Интересно, а корневые элементы как буим делать?

Зацикливание в дереве может возникнуть по нескольким причинам:
1) изменение ParentID - тут все понятно.
2) Вставка в дерево сразу нескольких записей в одной транзакции
в которых уже имеется зацикливание.
при вставке нескольких элементов есть вероятность того, что какая-то запись не вставицца, если данные были подготовлены криво,(как правило у всех программеров руки слегка кривоваты) поэтому лучше все делать последовательно закомитив.

ИМХО модель БД (таблицы, индексы, триггеры)
должна сама себя защищать от кривизны рук программистов, к чему я и стремлюсь всегда всеми силами.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388737
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUPING - оператор, позволяющий в SELECT выводить строки с промежуточными итогами по группам. В результате отчет формируется запросто одним единственным запросом.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388743
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще одно - Db2 - единственная база, которая поддерживает C++ в полной мере.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388766
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет проблем - пиши на С++.
Какого хрена тогда тут тебе по MS SQL надо спрашивать? Если ты такой умный?

ЗЫ Я не против сравнения, но именно ТАК..... Это в цирке надо товарищу выступать.

-- Tygra's --
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388778
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прости, Тигра, больше не буду ругать MS SQL...
Просто скучно мне было...)))
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388785
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему GROUPING есть в любом СУБД, во всяком случае известном мне (MSSQL, Sybase ASE, Sybase ASA). С деревьями тоже проблем не вижу - если ParentID NULLABLE, то FOREIGN KEY спокойно прокатывает. Насчет поддержки C++ не понял - по моему в любой СУБД можно спокойно писать расширенные хранимые процедуры на C или Java (вместо нее MSSQL скоро будет держать C#). С другой стороны не помню еще случая, когда мне бы понадобилось вместо обычной ХП накатать ее на C или Java. Разве что подумываю парсер SQL пристроить для собственных нужд, но это к СУБД на самом деле никакого отношения не имеет.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388796
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2gardenman
ну да, FK сам на себя.... А что? А корневые элементы, к примеру, с NULL в ParentId.
DB2 такое не умеет? Не знал :-( Я, правда, о ней почти ничего не знаю, кроме самого факта существования и чьей-то реплики " когда-то у DB2 был самый лучший оптимизатор".
По поводу проверки зацикливания. При срабатывании триггера after в базе вроде как уже записано дерево. Что мешает проверить его на зацикленность и при необходимости откатить транзкцию? И какая при этом разница, одну я запись вставил, или 20?
groupingset и cube rollup - попробуйте почитать BOL select... group by ... with rollup/cube - может быть это то, что Вы имеете в виду?
"Единственная... котороая поддерживает C++ в полной мере"
Мне казалось, что сервера БД должны поддерживать стандарты SQL.... :-) Ну хоть как-нибудь :-)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388870
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockygroupingset и cube rollup - попробуйте почитать BOL select... group by ... with rollup/cube - может быть это то, что Вы имеете в виду? Если это мне :), то я знаю, что есть GROUPING и CUBE/ROLLUP. Если GROUPINGSET тоже самое, то все понятно, если нет - хотелось бы услышать и объяснения :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388891
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2AAron
Не, не Вам :-)
Кста, вспомнилось - в select есть еще compute by..

В продолжение флейма: я могу написать запрос, который ни в жисть не напишешь на DB2 :-)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388921
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное что возможность исользовать SP на СLR .Net первым сделал IBM а не Microsoft :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388958
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Самое интересное что возможность исользовать SP на СLR .Net первым сделал IBM а не Microsoft :)

Ну, ведь и IBM надо хоть что-то делать, правда? ;-)
Не выходит с SQL, переключимся на процедурные языки....
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32388998
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 locky
Давай сюды твой запрос)).. хочеца заняцца творчеством...))
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389060
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2gardenman
Код: plaintext
1.
select @@microsoftversion

:-)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389470
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хе хе. Ну если СУБД поддерживает глобальные переменные, то MSSQL победим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 -- Процедура инициализации подключения сессии
 
create procedure sp_OnConnect ()
begin
  create variable @@MicrosoftVersion int;
  set @@MicrosoftVersion =  8 ;
end;

GO

 -- Устанавливаем процедуру
 
set option PUBLIC.LOGIN_PROCEDURE = 'sp_OnConnect';

GO

 -- Теперь в любом соединении работает
 
select @@MicrosoftVersion;

Script Copyright ASA9 :)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389487
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
Догадливые, блин... думал, задачка дольше продержится :-)
Хотя, если подходить формально, то результат - неправильный :-)
У меня в @@microsoftversion судя по всему лежит какая-та внутренняя версия. В BOL описания нету :-(
А ваще-та, всегда не любил Sybase за то, что там есть то, что мне иногда надо, а в MS SQL этого нету :-(
В частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389510
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из МСДН

if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389533
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyВ частности глобальные переменные и процедуры на коннект. ну, еще одна фича, насчет которой не уверен, но говорили, что есть (как бы так выразится): возможность выделение каждой сессии таких как бы глобальных временных таблиц, но видимых только изнутри одной сессии, с автоматическим созданием их при коннекте и убивании при дисконнекте.
Есть, есть :) Называется глобальные временные таблицы. Достаточно один раз создать, описание хранится в БД, а каждая подключаемая сессия ее видит как собственную, с своими данными и никаких проблем с разделением по сессиям и блокировками. Можно ее еще сделать как NOT TRANSACTIONAL в целях ускорения операций так сказать :) Еще в ASA можно делать вычисляемые поля на UDF, а по ним строить индексы, или в триггерах BEFORE изменять значения полей, TRUNCATE на таблицы с FOREIGN KEY и триггерами. А еще ...... она и на швейной машинке работать умеет :)

P.S.Будем надеятся, что все таки новый MSSQL оправдает надежды и пусть не все, но многое дополнит к своей функциональности. Иногда такие мелочи довольно таки приятны при проектировке БД.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389611
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389631
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 gardenman
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @BirthDate datetime,
	@vCurrentDate datetime

set @BirthDate = '19660914'
set @vCurrentDate = '20040127'

print @BirthDate
print @vCurrentDate

select datediff(dd, @BirthDate, @vCurrentDate)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389633
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SET DATEFORMAT dmy

select datediff(day,'14.9.1966', getdate())


или я че не понял?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389636
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
Oracle :)

Код: plaintext
1.
2.
3.
4.
5.
6.
   1 * select sysdate - to_date('14/09/1966', 'dd/mm/yyyy') as days  from dual
SQL> /

      DAYS
 ----------
 
 13649 , 7119 
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389640
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA
Код: plaintext
select Now() - convert(date, '19660914')

ответ: 13649
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389644
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это видно был тест - на что я правда не понял...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389665
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как я понял конкурс на "слабо" :) А вот такое слабо красивым кодом написать на других СУБД:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
begin
  declare @SQL long varchar;
  declare @Table_Name varchar( 128 );
  declare @Domain_Name varchar( 128 );

  set @Table_Name = 'Man';
  set @Domain_Name = 'VARCHAR';

  select 'select ' || List( c.Column_Name ) || ' from ' || @Table_Name
  into @SQL
  from SysColumn c
    key join SysTable t on t.Table_Name = @Table_Name
    key join SysDomain d on d.Domain_Name = @Domain_Name;

  execute immediate with result set on @SQL;
end

Данный пример возвращает набор данных c указанной таблицы (Man), в который включаются поля только с указанным типом (VARCHAR).
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389699
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
Oracle :)

Код: plaintext
1.
2.
3.
SELECT * FROM ALL_TAB_COLUMNS
where owner='MY_OWNER' and table_name='MY_TABLE'
and data_type='VARCHAR2' ;
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389731
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
use pubs
declare @n varchar( 100 ) set @n = 'authors'
declare @t varchar( 100 ) set @t = 'varchar'
declare @S varchar( 1000 )
set @S = ''
select @S = @S+(case when @s='' then ' ' else ',' end)+column_name
from information_schema.columns
where table_name=@n and data_type=@t

set @S = 'select'+@S+' from '+@n
exec sp_sqlexec @S
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389740
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше конечно
Код: plaintext
1.
set @S = 'select '+(case when @S='' then '''нету''' else @S end)+' from '+@n
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389766
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS
И нетранзакционность есть? Класс... еще больше ненавижу... Если при этом еще и индексы поддерживаются на таких таблицах... В Informix, по моим сведениям, тоже можно сделать нетранзакционные таблицы, но там несколько ограничений (вроде как нельзя на таких таблицах делать индексы).
А фича полезная....
Я как-то с горя пожаловался в форуме на то, что в MS SQL нельзя отключить transaction log, так чуть не съели, сказали что это неправильно... что всё должно логгироваться и всё такое...
А truncate и в MS SQL можно организовать, токо там приходится править системную таблицу для этого... так что это так - выверт :-(
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389871
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky
"Нетранзакционность" на глобальные временные таблицы есть. И индексы есть, в том числе можно и кластерный сделать. А заодно для полного счастья можно полноценна триггера BEFORE и AFTER повесить, хотя это выглядит забавно для временной сессионной таблицы.

All
Кстати очень полезная разминка, заодно можно посмотреть, чего и как в SQL у различных СУБД есть. Предлагаю продолжить тему для познавательных и просветительных целей, чтобы лучше представлять себе возможности конкурирующих БД.

Ну CTE (Common Table Expression) приводить в пример не буду, вроде WITH ... SELECT и поддержка иеархических запросов почти у всех есть или скоро будет (это к Якону).

Меня лично порадовали следующие расширения SQL в ASA. Интересно у кого есть аналоги:
KEY JOIN - связь таблиц по FOREIGN KEY:
Код: plaintext
1.
2.
select *
from Table1
  key left join Table2

3-е вкусности в KEY JOIN:
1. не надо в запросах вспоминать, по каким полям связывать таблицы
2. если поменять имена полей связи в структуре БД или даже сам FOREIGN KEY, то все запросы с KEY JOIN продолжают работать, так как связь тут уже не физическая, а логическая.
3. подстегивает начинающих получше продумывать связи таблиц

Расширенный INSERT
Код: plaintext
1.
2.
3.
insert into table1 on existing update with auto name
  select field1, field2
  from Table2

В данном примере в INSERT не надо указывать имена полей, по опции WITH AUTO NAME будут браться поля, имена которых совпадают с именами полей запроса. Опция ON EXISTING UPDATE в данном случае еще интереснее - фактически в TABLE1 будут добавлены все новые записи из TABLE2 и обновлены существующие (естественно для этого требуется наличие PRIMARY KEY, плюс чтобы оно не было AUTOINCREMENT). В обычном ANSISQL этот оператор как минимум придеться разбить на 2 части:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
update table1 t1
set field2 = t2.field2
from table1 t1
  inner join table2 t2 on t2.field1 = t1.field1

insert into table1 (field1, field2)
  select field1, field2
  from table2 t2
  where not exists(select * from table1 where field1 = t2.field1)


Ну в догонку: в принципе я так думаю никого не удивишь атомарными блоками и exception:
Код: plaintext
1.
2.
3.
4.
5.
6.
begin atomic
  insert ...
  update ...
  delete ...
exception
  when others then resignal
end

(для не знающих - любые операции в атомарном блоке или выполняются или откатываются, фактически это просто более простая запись SAVEPOINT транзакций).

Полезной фичей так же оказались виртуальные индексы. Смысл их прост - создаем виртуальный индекс, физически он не строиться, в БД не присутствует, соответственно времени на построение не занимает, никого не блокирует и на реальное выполнения запросов не влияет. Виден только на время действия сессии, если раньше не прибить командой DROP INDEX. Зато прекрасно виден в планах запросов, если их получать с опцией VIRTUAL. Это дает прекрасную возможность ничего не блокируя, не строя и не изменяя поиграться с индексами на таблицу, посмотреть, как все это выглядит в плане запроса и прикинуть, а стоит ли делать индекс и как его лучше сделать.

Интересно было бы узнать, у кого в других СУБД есть интересные расширения SQL ?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32389920
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman> Я родился 14 сентября 1966 г.
Вопрос - сколько дней я прожил?
Решите задачу на T-SQL
ответ я проверю...

А вот кто решит такую задачку на DB2?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390138
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 Database server        = DB2/NT  8 . 1 . 3 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = SAMPLE


values (days(current date) - days('14.09.1966'))

 1           
 -----------
 
       13650 

   1  record(s) selected.

...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390195
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 9.2

select *
from Table1
key left join Table2


KEY JOIN не нашел, зато есть NATURAL JOIN: тоже неявное указание полей, только по совпадению имен.
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_103a.htm#2080379

Мое личное мнение - от лукавого эти скрытые соответствия:) Теоретически между двух таблиц может существовать несколько ссылочных ограничений, а с другой стороны - имена полей в них необязательно совпадают.


insert into table1 on existing update with auto name
select field1, field2
from Table2


WITH AUTO NAME вроде нет. Можно, конечно поля не указывать, но тогда присвоение будет позиционное, ИМХО как и везде. Функцию ON EXISTING UPDATE выполняет оператор MERGE
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_915a.htm#2080942

Атомарные блоки для меня были всегда. "Для меня" - означает с версии Oracle 7.3, хотя скорее всего были и раньше.

Дополнительно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
dan@sqlmast>; col YEAR_TO_MONTH format a30
dan@sqlmast>; col DAY_TO_SECOND format a30
dan@sqlmast>; select (sysdate - to_date('14.09.1966', 'dd.mm.yyyy')) year to month year_to_month
   2       ,  (sysdate - to_date('14.09.1966', 'dd.mm.yyyy')) day to second day_to_second
   3   from dual;

YEAR_TO_MONTH                  DAY_TO_SECOND
 ------------------------------ ------------------------------
 
+ 000000037 - 04                   + 000013650   10 : 36 : 16 


Т.е. прошло полных 37 лет и 4 месяца
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390334
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 gardenman

Да, посчитало правильно.

Цитирую по памяти документацию по DB2 ver.7.x: При вычислении разницы дат полагается, что год содердит 365 дней, месяц содержит 30 дней.

Не поверил своим глазам, проверил на линуховой версии, отработало в полном соответствии с документацией, в феврале 2001 года оказалось 30 дней. Никто с таким эффектом сталкивался?

В остальном DB2 произвел очень хорошее впечатление.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390366
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМое личное мнение - от лукавого эти скрытые соответствия:) Теоретически между двух таблиц может существовать несколько ссылочных ограничений, а с другой стороны - имена полей в них необязательно совпадают.
Угу, в ASA тоже есть NATURAL JOIN, только я не стал их приводить как раз по той причине, что это от лукавого. KEY JOIN в отличие от NATURAL JOIN как раз однозначно определяет связь таблиц по существующему FOREIGN KEY (если его нет, то естественно будет возбуждена ошибка).

Еще навскидку парочка расширений SQL:

Расширенный UPDATE:
Код: plaintext
1.
2.
update top  100  Table1
set Field1 =  1 
order by Field2


Организация цикла FOR по курсору:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for LoopName as CursorName no scroll cursor 
for
  select Field1 as @Field1, Field2 as @Field2
  from Table1
  for read only
do
  print 'Field1 = ' || @Field1 || ', Field2 = ' || @Field2
end for

Данная конструкция организует именованный цикл LoopName, создает FORWARD ONLY курсор CursorName, внутри цикла обьявляет переменные @Field1 и @Field2 и соотвествующе последовательно перебирает весь курсор, ассоциируя переменные с значением полей текущей записи курсора.

Откат изменений из триггера:
Код: plaintext
ROLLBACK TRIGGER [WITH RAISERROR  20000  'Ошибка']

Оператор откатит изменения, сделанные на таблицу или внутри триггера, а не всю транзакцию. Если в операторе указывается ошибка, то оператор также откатит атомарный блок, если изменения таблицы шли внутри него. С учетом возможности обработки ошибок в begin ... exception ... end, я думаю этот оператор красиво вписывается в общую концепцию работы с транзакциями.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390520
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 9.2 Неявные курсоры есть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin
  for i in (
    select * from scott.emp
  ) loop
    dbms_output.put_line(i.empno||' '||i.ename);
  end loop;
end;
/


Про UPDATE надо посмотреть конструкцию UPDATE (SELECT ...) SET ..., ИМХО нечто похожее. В триггере (и не только) можно испоьзовать автномную транзакцию.

Похоже, разработчики решают одни и те же практические задачи и вводят расширения синтаксисов T-SQL. PL/SQL и т.п. Обидно другое: все это нестандартизованно, и если сейчас еще можно, глядя на чужой запрос, как-то догадаться о его предназначении, то в дальнейшем сложность восприятия, перевода из одного диалекта в другой, одинаковой реализации для нескольких диалектов будет только возрастать.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390532
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в sybase такого нету:

select * from tt1
where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2)

(подзапрос по нескольким полям сразу)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
create table tt1 (
    id1 integer,
    id2 date,
    name char( 35 )
)
@


create table tt2 (
    id1 integer,
    id2 date,
    name char( 35 )
)
@

insert into tt1 (id1,id2,name) values
( 1 ,current date,'111111111'),
( 1 ,current date,'2222222'),
( 1 ,current date,'3333333'),
( 1 ,current date,'44441'),
( 2 ,current date,'55555'),
( 2 ,date(days(current date)+ 1 ),'66666666'),
( 3 ,date(days(current date)+ 1 ),'77777777777')
@


insert into tt2 (id1,id2,name) values
( 1 ,current date,'111111111'),
( 1 ,current date,'111111111'),
( 2 ,date(days(current date)+ 1 ),'111111111'),
( 3 ,date(days(current date)+ 2 ),'111111111')
@
select * from tt1

ID1         ID2        NAME                               
 ----------- ---------- -----------------------------------
 
           1   28 . 01 . 2004   111111111                           
           1   28 . 01 . 2004   2222222                             
           1   28 . 01 . 2004   3333333                             
           1   28 . 01 . 2004   44441                               
           2   28 . 01 . 2004   55555                               
           2   29 . 01 . 2004   66666666                            
           3   29 . 01 . 2004   77777777777                         

   7  record(s) selected.


select * from tt1 where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2)

ID1         ID2        NAME                               
 ----------- ---------- -----------------------------------
 
           1   28 . 01 . 2004   111111111                           
           1   28 . 01 . 2004   2222222                             
           1   28 . 01 . 2004   3333333                             
           1   28 . 01 . 2004   44441                               
           2   29 . 01 . 2004   66666666                            

   5  record(s) selected.


select * from tt1 where (tt1.id1,tt1.id2) not in (select tt2.id1,tt2.id2 from tt2)

ID1         ID2        NAME                               
 ----------- ---------- -----------------------------------
 
           2   28 . 01 . 2004   55555                               
           3   29 . 01 . 2004   77777777777                         

   2  record(s) selected.

...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32390859
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА в sybase такого нету
Честно говоря, не понял в чем подвох. Вроде как все есть, только по другому:
вместо:
Код: plaintext
1.
insert into (Field1, Field2) values
( 1 ,  1 ),( 1 ,  2 )

будет:
Код: plaintext
1.
2.
3.
insert into (Field1, Field2) 
select  1 ,  1 
union all
select  1 ,  2 ;

вместо:
Код: plaintext
1.
select * from tt1 
where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2) 

будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select tt1.*
from tt1
  inner join tt2 on tt2.id1 = tt1.id1 and tt2.id2 = tt1.id2;

 -- еще можно связать по именам полей
 
select tt1.*
from tt1
  natural join tt2;

 -- если есть FOREIGN KEY, то можно и так
 
select tt1.*
from tt1
  join tt2;

 -- ну или так
 
select *
from tt1
where exists(
  select * 
  from tt2 
  where tt2.id1 = tt1.id1 and tt2.id2 = tt1.id2);

Кстати вопрос по использованию множества полей в IN - как будет происходить обработка с NULL значениями ?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391026
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NULL - всегда NULL
это значит что NULL<>NULL is TRUE NULL=NULL is FALSE
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391043
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть если я Вас правильно понял, то для запроса:
Код: plaintext
1.
select * from tt1 
where (tt1.id1,tt1.id2) in (select tt2.id1,tt2.id2 from tt2) 

если tt1.id1 = null и tt2.id1 = null, а tt1.id2 = tt2.id2 , то такая запись в данном запросе не вернется ? Тогда в чем отличие такой конструкции например от INNER JOIN или EXISTS ?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391065
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2gardenman: Сравнение NULL<>NULL в Oracle даст FALSE, как и любое сравнение с NULL.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391088
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнение NULL<>NULL в Oracle даст FALSE, как и любое сравнение с NULL
А в аксесе Null<>Null даст False (что в предложении Where работает как False)

Кстати о Null-ах.
Объясните мне, непонятливому, почему в MS SQL необязательный уникальный индекс может содержать только одну запись с Null-ом? Как же быть с тем, что Null ничему не равен (в том числе и Null-у)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391114
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS
Ты действительно прав. Это очень похожие вещи.

Просто у меня перед глазами)) "хороший пример" проектирования,
на Sybase когда имеется с десяток таблиц, и одна на другую завязана
последовательно. У меня в результате - десятиэтажные запросы.
Лень писать. Да и в ссылках запутаться можно. А первичные ключи сплошь
сделаны только по одному полю, которое как правило IDENTITY.
И все едва-едва ворочается...
Я не могу понять что побудило человека строить модель именно так...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391120
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще помню фокус по Sybase, что запрос

select * from table_name where field_name is null

может использовать построенный по TABLE_NAME.FIELD_NAME индекс.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391134
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох прав.) Действительно - любое сравнение с NULL всегда FALSE
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391143
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drop procedure c1
go

create procedure c1 as
begin
declare @aa int,
@bb int
select @aa=null,@bb=null

select
case
when @aa=@bb then 'Равно'
else 'Облом'
end
end
go

c1


Результат:
-
Равно


но, когда джойним через индекс две таблицы, то))) NULL<>NULL!!!)))
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391160
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любая операция в Oracle (кроме конкатенации), в том числе и сравнение с NULL чего угодно даст NULL, а никак не FALSE, но при группировке NULL считаются равными.

Учите матчасть
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391229
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКстати о Null-ах.
Объясните мне, непонятливому, почему в MS SQL необязательный уникальный индекс может содержать только одну запись с Null-ом? Как же быть с тем, что Null ничему не равен (в том числе и Null-у)
Хм. Ради интереса сейчас попробовал на ASA. Там работает. А я по привычке после MSSQL даже это и не догадался проверить. Бум знать, спасибо за мысль :)

авторselect * from table_name where field_name is null
может использовать построенный по TABLE_NAME.FIELD_NAME индекс.
Угу, так и есть.

gardenman
Результат сравнения и обработки NULL зависит от реализации и настроек конкретной СУБД. Например в ASA Ваш пример всегда будет 'Облом', так как сравниваются 2 переменные. Если же выключить опцию ANSINULL, то в запросах, в разделах WHERE, ON и HAVING условия NULL = NULL станет истинным для сравнений значений полей с полями и переменными. Так что у Вас получается 2 переменные с NULL равны. А в ASA например, в CHECK поля или таблицы, условие NULL = 1 будет истинным :)

Мда, одно дело различная функциональность СУБД, но различия даже в способах обработки NULL выглядят печально. На лицо явная смерть стандарта SQL и образование нескольких независимых направлений SQL и их клонов в продуктах:

блокировочники
TSQL: MSSQL,Sybase ASE, Sybase ASA
WatcomSQL: Sybase ASA

версионники
PL/SQL: Oracle, PostgreSQL
Interbase SQL: Interbase, Firebird

ну наверное и т.д. (про Informix и DB2 ничего сказать не могу, к чему их отнести, так как ничего про них не слышал и не видел).
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391292
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет NULL<>NULL я опять попался, а все из-за того, что в коде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin
  if null<>null then
    dbms_output.put_line('THEN');
  else
    dbms_output.put_line('ELSE');
  end if;
end;
/


блок ELSE будет выполнен. Хотя запрос

select * from scott.emp where not (null <> null)

не вернет ни одной записи.

Столкнулся с MSSQL 2000. Объясните, почему:

1. 'a' like 'A' возвращает TRUE, это где-то в настройках прописывается регистронезависимое сравнение? В Oracle это будет FALSE.
2. Почему по крайней мере Query Analyzer нечуствителен к регистру написания вызываемых процедур? Если, допустим, есть процедура MyProc, то ее можно вызвать как MYPROC, myproc и т.д. Могут ли одновременно существовать процедуры с именами MyProc и myProc?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391398
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Denis Popov

1. зависит от collation
2. зависит от настроект коннекта, см SET QUOTED_IDENTIFIER
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391530
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я писалА в аксесе Null<>Null даст False (что в предложении Where работает как False)
Тьфу блин. Разумется Null <> Null даст Null, (что в Where эквивалентно False)
Если б не замечание Глюка - так бы и не заметил.

Так кто-нить может объяснить - в чем физический (математический, логический и т.п.) смысл того, что уникальном необязательном индексе не может быть два раза Null?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391636
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Лох Позорный

>Так кто-нить может объяснить - в чем физический (математический, логический и т.п.) смысл того, что уникальном необязательном индексе не может быть два раза Null?

Это понять нельзя, это нужно запомниить (C). В стандарте написано, что NULL уникальным индексом индексироваться не должен. Это логично. Но единственная СУБД, известная мне, позволяющая много строк с NULL в уникальном индексе, т.е соответствующая стандарту по этому пункту, это Sybase ASA.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391644
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 буквацифра
Гыы...
Ты будешь смеяться, но еще и аксес
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391650
Пьяный Лох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, конечно, извини
В твоем понимании Аксес - не СУБД
а двигатель от паровоза
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391686
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ни странно, но Jet Access имеет полезные фичи, который отсутствуют в SQL серверах (например позволяет изменять данные, полученные на основании запросов, который в SQL серверах были бы однозначно как Static). IMHO Jet - один из лучших SQL файл-серверных движков.

Да и как клиент он в принципе не плох. Очень правдо досадно, что MS-овцы так жестко навязали в ADP проектах ему в спутники MSSQL, у меня есть знакомые, которые программят на Access, и хотели бы его и дальше использовать в качестве средства построения клиентских приложений, но уже с БД на SQL сервере. С учетом того, что в качестве СУБД им хотелось бы видеть ASA, то варианты получаются не очень красивыми - все делать через присоединенки, поменять Access на что нибудь еще (тут ближе всего стоит PowerBuilder, но все равно учить не мало) или отказаться от расширенной функциональности ASA и работать на связке MSSQL + Access ADP. Я лично считаю, что MS поступила не честно в отношении Access, которому по идее при работе через ADO по барабану с какой СУБД работать, срезав круг его применения до разработки клиентских приложений только под MSSQL.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391752
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил про фичу Акесе, которой нет наверное нигде: группировочная функция First :)


2ASCRUS
> учетом того, что в качестве СУБД им хотелось бы видеть ASA, то варианты получаются не очень красивыми - все делать через присоединенки

Лучше тогда вообще не присоединять (линковать), а использовать запросу к серверу, да через DAO/ADO вызывать хранимые процедуры, используя полученные наборы в качестве источников спискво, форм, отчетов (с Акеса 2002)
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391874
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Oracle уникальный индекс может построен по полю, содержащему сколько угодно NULL-значений. Они просто не включаются в индекс, уникальный или неуникальный. Побочное следствие: запрос с WHERE COLUM_NAME IS NULL использовать такой индекс не сможет.

В Accesse по-моему есть возможность построения кросс-табличных запросов, т.е. "разворота" значений выбранных полей по горизонтали. ИМХО для аналитики может быть полезным, и больше нигде я такого не видел.

Ответьте пожалуйста на м.б. дилетантский вопрос: COLLATE в MSSQL влияет на сопоставление строчных и прописных букв (т.е. указывает, что 'd' -строчная буква с соответствующей прописной 'D'), или влияет на отработку LIKE, т.е. на результат операции 'd' LIKE 'D'?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32391938
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Denis Popov
В Oracle уникальный индекс может построен по полю, содержащему сколько угодно NULL-значений.

Как уже сказали в Акесе можно, в сиквеле тоже можно, но только 1 значение Null

В Accesse по-моему есть возможность построения кросс-табличных запросов, т.е. "разворота" значений выбранных полей по горизонтали. ИМХО для аналитики может быть полезным, и больше нигде я такого не видел.

Угу. Есть такое - перекрестный запрос. В Юконе говорят тоже будет

Ответьте пожалуйста на м.б. дилетантский вопрос: COLLATE в MSSQL влияет на сопоставление строчных и прописных букв (т.е. указывает, что 'd' -строчная буква с соответствующей прописной 'D'), или влияет на отработку LIKE, т.е. на результат операции 'd' LIKE 'D'?

Хотя я и не большой спец в сиквеле, но думаю особо не на вру :)
Да, влияет на сопоставление (и поэтому влияет и на отбор, в т.ч. и Like): Например, COLLATE Cyrillic_General_CI_AS - без учета регистра, COLLATE Cyrillic_General_CS_AS - c учетом регистра. Можно задавать для конкретного поля.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32392014
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Denis Popov
Можно задавать даже не для поля, а для операции поиска/сравнения.
Например, поле "логин" у вас регистрозависимое. При авторизации человек должен набрать его правильно.
Но администратор при поиске хочет искать его независимо от регистра. Тогда надо написать:

WHERE [login] LIKE @login COLLATE Cyrillic_General_CI_AS
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32393011
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Senin Viktor

>в сиквеле тоже можно, но только 1 значение Null

Одно значение везде можно.

2 Denis Popov

>В Oracle уникальный индекс может построен по полю, содержащему сколько угодно NULL-значений. Они просто не включаются в индекс, уникальный или неуникальный. Побочное следствие: запрос с WHERE COLUM_NAME IS NULL использовать такой индекс не сможет.

Так и должно быть по стандарту. Не знал. А вот в DB2 (7.x) этого сделать нельзя.

>В Accesse по-моему есть возможность построения кросс-табличных запросов, т.е. "разворота" значений выбранных полей по горизонтали. ИМХО для аналитики может быть полезным, и больше нигде я такого не видел.

В Sybase ASA это можно сделать с помощью функции list.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32393135
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
connect to sample user db2admin using       

   Database Connection Information

 Database server        = DB2/NT  8 . 1 . 3 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = SAMPLE


create table ttt1 ( id integer, name char( 35 ) )
DB20000I  The SQL command completed successfully.

create unique index ittt1 on ttt1 (id)
DB20000I  The SQL command completed successfully.

insert into ttt1 (id,name) values (NULL,'qweqwe')
DB20000I  The SQL command completed successfully.

insert into ttt1 (id,name) values (NULL,'qweqerwerwe')
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0803N  One or more values in the INSERT statement, UPDATE statement, or 
foreign key update caused by a DELETE statement are not valid because the 
primary key, unique constraint or unique index identified by  "1 " constrains 
table  "DB2ADMIN.TTT1"  from having duplicate rows for those columns.  
SQLSTATE= 23505 

insert into ttt1 (id,name) values (NULL,'qweqwerwerwe')
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0803N  One or more values in the INSERT statement, UPDATE statement, or 
foreign key update caused by a DELETE statement are not valid because the 
primary key, unique constraint or unique index identified by  "1 " constrains 
table  "DB2ADMIN.TTT1"  from having duplicate rows for those columns.  
SQLSTATE= 23505 


и не только в 7-ке и 8-ке тоже...
Что поделать - уникальный индекс всегда уникальный...

И не только в DB2, но и в Sybase ASE 12.5.03

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table ttt1 (
	id integer,
	name char( 35 )
)

create unique index ittt1 on ttt1(id)

insert into ttt1 (id,name) values (NULL,'1111')
insert into ttt1 (id,name) values (NULL,'34531111')

Server Message:  Number   2601 , Severity   14 
Server 'pnsybase', Line  1 :
Attempt to insert duplicate key row in object 'ttt1' with unique index 'ittt1' 
Server Message:  Number   3621 , Severity   10 
Server 'pnsybase', Line  1 :
Command has been aborted. 

...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32394596
с127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 gardenman

>и не только в 7-ке и 8-ке тоже... Что поделать - уникальный индекс всегда уникальный...

NULL - особое значение, он не должен индексироваться.

Поработал как-то с DB2, осталось очень хорошее впечатление, лучше даже чем от оракла, но 2 вещи мягко говоря удивили: 30 дней в месяце (это уже исправили, странно только что продержалось аж до 7-й версии) и индексация NULL.

>И не только в DB2, но и в Sybase ASE 12.5.03

Возможно, но я говорил об ASA.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32394666
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 с127
NULL - особое значение, он не должен индексироваться
Ну почему же не должен. Если очень хочется - то можно и поиндексировать. В аксесе любой индекс имеет параметр IgnoreNulls, как раз указывающий, будут ли индексироваться Null'ы.
Но вот нарушенияуникальности из-за повторяющихся Null'ов быть не должно.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32394917
xz321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c127 как ты считал в DB2 v7. кол-во дней в феврале???

db2inst1$ db2 select (days('01.03.2001')-days('01.02.2001')) from sysibm.sysdummy1

1
-----------
28

1 record(s) selected.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32396020
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Лох Позорный

>>NULL - особое значение, он не должен индексироваться
>Ну почему же не должен.

Так написано в стандарте. Возможно имелось в виду, что в поле с уникальным индексом может быть несколько NULL значений, т.е. unique на NULL не распространяется. Я цитирую по памяти.

2 xz321
>Guest c127 как ты считал в DB2 v7. кол-во дней в феврале???
>
>db2inst1$ db2 select (days('01.03.2001')-days('01.02.2001')) from >sysibm.sysdummy1
>
>1
>-----------
>28

Примерно так и считал, получил 30 дней. Того дистрибутива давно нет, но это есть в документации, у ИБМ хорошая документация. Постараюсь найти и прислать ссылку.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32401928
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS
ASCRUSKEY JOIN в отличие от NATURAL JOIN как раз однозначно определяет связь таблиц по существующему FOREIGN KEY (если его нет, то естественно будет возбуждена ошибка).
Ээээ.... А если этих FOREIGN KEY две штуки? Тоже будет ошибка возбуждена?
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32402014
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭэээ.... А если этих FOREIGN KEY две штуки? Тоже будет ошибка возбуждена?
Отвечу вопросом на вопрос:
А на кой это между 2 таблицами связь дважды устанавливать ? Ну разве что, если в таблице 2-е разных ссылки на один и тот же справочник. В таких ситуациях INNER JOIN никто не отменял :)

Если же Вы дважды по одним и тем же полям внешний ключ сделаете, то ошибки возбуждено не будет. Таблицы в запросе через KEY JOIN будут соединяться по первому найденому внешнему ключу. Однако в окне лога ASA очень часто будет проскакивать предупреждающее сообщение о дублировании внешних ключей на таблицу. В ASA вообще полезно окно лога читать почаще, там много чего пишется: чего в БД не так, насколько она дефрагментирована на файловой системе, отмечаются моменты откушивания и отдавания динамической памяти, прохождения плановых точек сохранения и т.д. Ну и конечно мои БД туда разную полезную информацию катают, всегда можно увидеть, кто чего делает и на каком этапе находится.
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32402042
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА на кой это между 2 таблицами связь дважды устанавливать ? Ну разве что, если в таблице 2-е разных ссылки на один и тот же справочник
Вот-вот, именно две разные ссылки на один и тот же справочник.
Будет ошибка? Или оно тоже будет первый попавшийся внешний ключ использовать?

авторВ таких ситуациях INNER JOIN никто не отменял :)
Мне интереснее поведение системы именно в случае KEY JOIN'а. Особенно если структура базы ненароком изменится, и там, где был всего один внешний ключ, добавится другой (но на тот же справочник). Что в этом случае произойдет? Часть запросов перестанет работать? Или, что еще хуже, запросы будут работать, но уже по другому?
Не нравится мне что-то такая фича...
...
Рейтинг: 0 / 0
Сравнительный анализ MS Sql и другие...
    #32402070
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня такая табличка :)
Код: plaintext
1.
2.
SELECT * 
FROM  "DBA" . "CalcObjectManual" 
  KEY JOIN SysTypePropCalcAlgorithmManual

На выходе:
Код: plaintext
1.
2.
3.
4.
Line  1 , column  1 
Could not execute statement.
[Sybase][ODBC Driver][Adaptive Server Anywhere]
Для соединения 'CalcObjectManual' с 'SysTypePropCalcAlgorithmManual'
имеется более одного способа
...
Рейтинг: 0 / 0
82 сообщений из 82, показаны все 4 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Сравнительный анализ MS Sql и другие...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]