Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
Добрый Э - Эх
Glory
Мне то все равно. А вот быть может уже в следующей версии сервер вас не простит и пошлет подальше
кстати, а старообрядные внешние джойны через where + , + =* ещё работают или уже запрещены?

З.Ы.
сервера под рукой для проверки нет.

Msg 4147, Level 15, State 1, Line 39
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, 
using stored procedure sp_dbcmptlevel. 
It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). 
In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.
22 апр 15, 11:46    [17547718]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Minamoto, https://msdn.microsoft.com/en-us/library/ms144262(sql.110).aspx
22 апр 15, 11:47    [17547722]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
ЦБ
In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.

даа, это на 2005,
может на "выше" - уже нет в принципе ...
22 апр 15, 11:47    [17547723]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
o-o
Guest
Minamoto
Добрый Э - Эх, а они были когда то разрешены? Вроде бы только Oracle такой синтаксис поддерживал.

да прям.
2000-ый это поддерживает и сервера, допускающие базы с COMPATIBILITY_LEVEL 80, тоже:
(ErrorMsg по куче строк -- моя работа)

К сообщению приложен файл. Размер - 79Kb
22 апр 15, 11:50    [17547740]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
Добрый Э - Эх
Glory
Мне то все равно. А вот быть может уже в следующей версии сервер вас не простит и пошлет подальше
кстати, а старообрядные внешние джойны через where + , + =* ещё работают или уже запрещены?

З.Ы.
сервера под рукой для проверки нет.
Это в Oracle так.
В MSSQL было *= и =*.
Запрещено с 2005 года!
22 апр 15, 11:57    [17547794]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
pinkrose
iap
AND d.DG_CRDATE < '20150419' -- договор заключен по '20150418'


по - имеется в виду, что включая эту дату, поэтому - <=
У меня и написано "включая '20150418'"
А вот у Вас выпадает целый день '20150418', начиная с первого мгновения после полуночи!
22 апр 15, 12:01    [17547802]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
iap
Добрый Э - Эх
пропущено...
кстати, а старообрядные внешние джойны через where + , + =* ещё работают или уже запрещены?

З.Ы.
сервера под рукой для проверки нет.
Это в Oracle так.
В MSSQL было *= и =*.
Запрещено с 2005 года!
я так и написал. "плюсик" там был в качестве "оператора конкатенации", собирающий в кучу ключевое слово where, знак препинания "запятая" и оператор внешнего соединения "=*" :)

сорри, если кого-то "плюсики" ввели в заблуждение
22 апр 15, 12:02    [17547815]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
Добрый Э - Эх
iap
пропущено...
Это в Oracle так.
В MSSQL было *= и =*.
Запрещено с 2005 года!
я так и написал. "плюсик" там был в качестве "оператора конкатенации", собирающий в кучу ключевое слово where, знак препинания "запятая" и оператор внешнего соединения "=*" :)

сорри, если кого-то "плюсики" ввели в заблуждение
Я подумал про (+) в Oracle :-))
22 апр 15, 12:08    [17547857]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
o-o
Guest
iap
Запрещено с 2005 года!

еще раз: "Запрещено" в базах, с compatibility_level> 80.
вон же на картинке 2008 R2 спокойно отработал в Pubs-е, взятом с 2000-ого
22 апр 15, 12:12    [17547878]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
o-o
iap
Запрещено с 2005 года!

еще раз: "Запрещено" в базах, с compatibility_level> 80.
вон же на картинке 2008 R2 спокойно отработал в Pubs-е, взятом с 2000-ого
Кому нужны базы в режиме совместимости 80?
Какой в этом смысл?
Не зря же я столько сил потратил при переходе на SQL2005,
вычищая старорежимные внешние соединения ANSI SQL-89!
22 апр 15, 12:15    [17547905]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
o-o
Guest
iap,

если мой ответ (отражающий действительность) вас не устраивает,
напишите в MS и потребуйте отменить compatibility_level 80.
нужны ли такие базы, не нужны ли, не отменяет поддерживаемого функционала
22 апр 15, 12:20    [17547944]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
pinkrose
Member

Откуда:
Сообщений: 56
Glory
JOIN ...ON ...
JOIN ...ON ...
JOIN ...ON ...
JOIN ...ON ...
JOIN ...ON ...
JOIN ...ON ...
JOIN ...ON ...


Если честно, то на форумах я узнала больше, чем было в универе.

Если переделать учебный пример из моего конспекта для четырех таблиц, то это будет так?
SET value1 = 100
SELECT
	t1.field_1_1,
	t1.field_1_2,
	t2.field_2_1,
	t2.field_2_2,
	t3.field_x1_y2,
	t4.field_x2_y2
FROM
	[table1] AS t1
	JOIN [table2] AS t2 ON t2.field_2_1 = t1.field_1_2
	JOIN [table3] AS t3 ON t3.field_1_1 = t1.field_1_2
	JOIN [table4] AS t4 ON t4.field_1_1 = t1.field_1_2
WHERE
	t1.field_1_1 = value1	-- основное условие
ORDER BY
	t1.field_1_1

Или я опять не поняла?
А зачем нужен LEFT, ведь он выделяет определенное количество знаков в строке слева, а нужна целая строка?

Можете подсказать название простой книжки на русском языке, где описан современный синтаксис SQL и много примеров?
22 апр 15, 12:21    [17547952]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Glory
Member

Откуда:
Сообщений: 104760
pinkrose
А зачем нужен LEFT, ведь он выделяет определенное количество знаков в строке слева, а нужна целая строка?

Что ?
22 апр 15, 12:24    [17547977]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
pinkrose
А зачем нужен LEFT, ведь он выделяет определенное количество знаков в строке слева, а нужна целая строка?
какая прелесть... :)

Если что: LEFT - это ключевое слово, которое в зависимости от синтаксиса и контекста своего употребления может быть не только строковой функцией, но и оператором внешнего соединения.

прослот загугли OUTER JOIN и почитай что это, зачем нужно и как синтаксически записывается на ANSI-SQL
22 апр 15, 12:25    [17547984]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
Glory
pinkrose
А зачем нужен LEFT, ведь он выделяет определенное количество знаков в строке слева, а нужна целая строка?

Что ?
она про другой лефт подумала...
22 апр 15, 12:28    [17548006]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
pinkrose
Можете подсказать название простой книжки на русском языке, где описан современный синтаксис SQL и много примеров?
родная документация уже не вариант?
22 апр 15, 12:30    [17548028]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
pinkrose, недавно на Хабре один из авторов опубликовал серию статей - получился небольшой и, вроде бы, достаточно простой мини-учебник, попробуйте почитать:

http://habrahabr.ru/post/255361/
22 апр 15, 12:31    [17548044]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
pinkrose
Можете подсказать название простой книжки на русском языке, где описан современный синтаксис SQL и много примеров?
родная документация уже не вариант?
ну или как вариант - практически любая из тут указанных
22 апр 15, 12:31    [17548045]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
o-o
напишите в MS и потребуйте отменить compatibility_level 80.
нужны ли такие базы, не нужны ли, не отменяет поддерживаемого функционала
можно уже не писать :)
по ссылке отсюда - 17547722

CategoryDiscontinued featureReplacement
Compatibility level80 compatibility levelsDatabases must be set to at least compatibility level 90.
22 апр 15, 12:33    [17548062]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
pinkrose
Member

Откуда:
Сообщений: 56
Добрый Э - Эх
pinkrose
Можете подсказать название простой книжки на русском языке, где описан современный синтаксис SQL и много примеров?
родная документация уже не вариант?
Конечно, но очень трудно читается.
22 апр 15, 12:37    [17548089]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
pinkrose
Member

Откуда:
Сообщений: 56
Minamoto
pinkrose, недавно на Хабре один из авторов опубликовал серию статей - получился небольшой и, вроде бы, достаточно простой мини-учебник, попробуйте почитать:

http://habrahabr.ru/post/255361/

Спасибо огромное!
Похоже, это то, что я искала.
22 апр 15, 12:42    [17548125]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
pinkrose
Добрый Э - Эх
пропущено...
родная документация уже не вариант?
Конечно, но очень трудно читается.
И всё же. Без этого никуда!
Если там углубиться по ссылкам, то конкретно про JOIN:

https://msdn.microsoft.com/ru-ru/library/ms177634.aspx

Что там сложного? Там понятные комментарии и примеры есть.
22 апр 15, 12:43    [17548133]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
YesSql
Guest
pinkrose
Из таблицы [History] надо выбрать номера счетов [HI_SHIT] с датой выставления [HI_DATE] и кодом пассажира [HI_DGCOD], соответствующим коду [DG_CODE] в таблице [Dogovor], если первичные договора попадают в диапазон дат [DG_CRDATE], '01.04.2015' и '18.04.2015', и выполняется еще несколько несущественных для моей проблемы условий.

Вопрос в том, что запрос возвращает по каждому клиенту не одну, а несколько записей потому что могло выставляться несколько счетов, и они могут различаться даже на пару секунд по времени выставления. А правильным считается последний счет (по дате/времени выставления).

HI_DGCOD    HI_SHIT    HI_DATE
77151 9551чл 2015-04-16 14:09:32.310
77151 9552чл 2015-04-16 14:09:35.600
Как при помощи такого Sql-запроса для каждого договора получить только одну запись с последним номером счета [HI_SHIT]?


Общее решение для такого типа задачек это отображение таблицы саму на себя и выборка максимальных дат (или максимальных номеров счетов HI_SHIT) с тем же id. что то типа такого
select * 
from  [db1].[dbo].[Dogovor] AS d 
where not exists ( select * 
                           from  [db1].[dbo].[Dogovor] AS d1 
                           where d.HI_DGCOD = d1.HI_DGCOD and d1.HI_DATE < d.HI_DATE)

В вашем случае условий много и их придется повторять во внутреннем запросе. Я бы выбрал сначала все во временную таблицу а потом убрал бы все дубликаты приведенным методом. Ну или использовал бы CTE если это возможно.
.
22 апр 15, 13:59    [17548782]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
YesSql
Guest
Ой... знак наоборот для выборки максимальной даты
YesSql
select * 
from  [db1].[dbo].[Dogovor] AS d 
where not exists ( select * 
                           from  [db1].[dbo].[Dogovor] AS d1 
                           where d.HI_DGCOD = d1.HI_DGCOD and d1.HI_DATE  >  d.HI_DATE)

.
22 апр 15, 14:05    [17548829]     Ответить | Цитировать Сообщить модератору
 Re: Как найти самую позднюю дату-время при помощи подзапроса?  [new]
Добрый Э - Эх
Guest
YesSql,

все наиболее распространенные способы решения именно этой задачи, в том числе и на not exists-подзапросе, описаны по ссылке, которую я привел ещё на прошлой странице...
22 апр 15, 15:04    [17549240]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить