powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом новичку...
21 сообщений из 21, страница 1 из 1
Помогите с запросом новичку...
    #38711664
Domiurg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT 
                      Customers.customerID AS ID, Customers.aliasID, Customers.Name, Customers.Surname, Customers.Phone, Customers.Mobile, Customers.RegDate, 
                      Orders.customerID, Orders.endDate
FROM         Customer Customers LEFT OUTER JOIN
                      ViewRepairOrders Orders ON Orders.customerID = Customers.customerID
WHERE     (Orders.endDate > '01.1.2014')
ORDER BY Customers.customerID



Все нормально выводит, но записи по customerID повторяются
А хотелось бы иметь одну строку по customerID с условием из второй таблички
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711669
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двух одинаковых записей при DISTINCT в результате быть не может.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711671
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
WHERE     (Orders.endDate > '01.1.2014')

делает LEFT JOIN Orders бессмысленным (равным JOINу)
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711674
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Код: sql
1.
WHERE     (Orders.endDate > '01.1.2014')


делает LEFT JOIN Orders бессмысленным (равным JOINу)Если не обращать внимания на нестандартный строковый формат даты.

P.S. DISTINCT оставляет по одной записи из совпадающих по ВСЕМ полям записей результата запроса,
а не только по customerID
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711675
Domiurg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав КолосовДвух одинаковых записей при DISTINCT в результате быть не может.

Так и я так думал, но что-то не доганяю

...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711678
Domiurg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapiap
Код: sql
1.
WHERE     (Orders.endDate > '01.1.2014')


делает LEFT JOIN Orders бессмысленным (равным JOINу)Если не обращать внимания на нестандартный строковый формат даты.

P.S. DISTINCT оставляет по одной записи из совпадающих по ВСЕМ полям записей результата запроса,
а не только по customerID

Вот... Теперь и я понял

А мне нужно отобрать из первой таблички только те записи, которые есть во второй табличке, но ограниченные по дате

В терминах задачи - отобрать всех клиентов, которые обслуживались за текущий год
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711684
Domiurg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде как так получилось то что надо

Код: sql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT 
                      Orders.customerID, Customers.customerID AS ID, Customers.aliasID, Customers.Name, Customers.Surname, Customers.Phone, Customers.Mobile, Customers.RegDate
FROM         ViewRepairOrders Orders LEFT OUTER JOIN
                      Customer Customers ON Orders.customerID = Customers.customerID
WHERE     (Orders.endDate > '01.1.2014')
ORDER BY Orders.customerID
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711686
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уберите записи из таблицы ORDERS... Даты окончания разные, они мешают. Или агрегируйте эти даты в min() или max().
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711822
mrGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Domiurg,

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT top(1) with ties -- вместо DISTINCT
                      Customers.customerID AS ID, Customers.aliasID, Customers.Name, Customers.Surname, Customers.Phone, Customers.Mobile, Customers.RegDate, 
                      Orders.customerID, Orders.endDate
FROM         Customer Customers JOIN -- вместо бессмысленного LEFT JOIN
                      ViewRepairOrders Orders ON Orders.customerID = Customers.customerID
WHERE     (Orders.endDate > '01.1.2014')
ORDER BY row_number() over (partition by Customers.customerID order by Orders.endDate desc) -- вместо просто сортировки 
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38711951
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
логичнее не соединять, а использовать exists .
т.е. выборка from customer c
Код: sql
1.
2.
where exists (select * from ViewRepairOrders o where o.customerID = c.customerID 
      and o.endDate > '20140101')  -- "обслуживались за текущий год", 

и не надо будет никакой distinct лепить
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712052
mrGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o-oлогичнее не соединять, а использовать exists .
т.е. выборка from customer c
Код: sql
1.
2.
where exists (select * from ViewRepairOrders o where o.customerID = c.customerID 
      and o.endDate > '20140101')  -- "обслуживались за текущий год", 

и не надо будет никакой distinct лепить

1. Так тоже можно, но в исходном запросе автора выводилась дата заказа, возможно она ему нужна.
2. "select *" - это Вас кто так научил писать? Бросьте немедленно.
3. Подзапросы тоже надо использовать с осторожностью - могут сильно замедлить выполнение (не конкретно про этот случай).
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712059
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrGuest2. "select *" - это Вас кто так научил писать? Бросьте немедленно.SELECT * в EXISTS() - это нормально. Общепринятая практика.
Хотя там можно писать почти всё, что угодно. Это неважно.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712075
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
mrGuest2. "select *" - это Вас кто так научил писать? Бросьте немедленно.


ну уж точно не mrGuest учил :)
приведу цитату уважаемого мной автора по этому поводу
а соглашаться ли с Ициком Бен-Ганом или с mrGuest-ом -- личное дело каждого

Unlike most other cases, in this case it’s logically not a bad practice to use an asterisk (*) in the SELECT
list of the subquery in the context of the EXISTS predicate
. The EXISTS predicate only cares
about the existence of matching rows regardless of the attributes specified in the SELECT list, as if the
whole SELECT clause were superfluous. The SQL Server database engine knows this, and in terms of
optimization, ignores the subquery’s SELECT list. So in terms of optimization, specifying the column
wildcard * in this case has no negative impact when compared to alternatives such as specifying a constant.

However, some minor extra cost might be involved in the resolution process of expanding the
wildcard against metadata info. But this extra resolution cost is so minor that you will probably barely
notice it. My opinion on this matter is that queries should be natural and intuitive, unless there’s a very
compelling reason to sacrifice this aspect of the code. I find the form EXISTS(SELECT * FROM . . .) much
more intuitive than EXISTS(SELECT 1 FROM . . .). Saving the minor extra cost associated with the resolution
of * is something that is not worth the cost of sacrificing the readability of the code
.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712112
mrGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для exists я согласен :)
Но думаю, что лучше придти к такому написанию осознанно (при желании), когда не имеешь привычки писать везде и всюду "select *", и знаешь почему это плохо.
А покажи новичку в SQL, что так можно писать и он ведь так и будет писать, потому что лень, а не по религиозным соображениям.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712125
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrGuestНо думаю, что лучше придти к такому написанию осознанно (при желании),
К этому надо "придти" через чтение хелпа. В котором производителм ясно написал

Notice that subqueries that are introduced with EXISTS are a bit different from other subqueries in the following ways:
- The keyword EXISTS is not preceded by a column name, constant, or other expression.
- The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are just testing whether rows that meet the conditions specified in the subquery exist.

ЗЫ
"Городская легенда" 1 лучше, чем * была правдой для теперь уже древних версий MSSQL.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712140
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта легенда бьёт все рекорды по-моему :)
Ни у одного фаната этой идеи не хватило, не знаю чего, просто проверить план запроса.

select * в общем случае имело и имеет смысл, необходимо лишь понимать последствия.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712156
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в одном случае звезду просто не получится написать физически и всё-таки придется использовать SELECT 1
Код: sql
1.
2.
3.
4.
5.
create view dbo.Test
with schemabinding
as
	select 'yes'
	where exists(select * from sys.objects)

Msg 1054, Level 15, State 6, Procedure Test, Line 5
Syntax '*' is not allowed in schema-bound objects.
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712163
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillв одном случае звезду просто не получится написать физически
Как будто в таком представлении только в части exists нельзя написать *
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712182
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryShakillв одном случае звезду просто не получится написать физически
Как будто в таком представлении только в части exists нельзя написать *но для exists() могли бы это ограничение не учитывать. видимо, выбор был сделан в пользу простоты парсера
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712185
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillGloryпропущено...

Как будто в таком представлении только в части exists нельзя написать *но для exists() могли бы это ограничение не учитывать. видимо, выбор был сделан в пользу простоты парсера
А в команде CREATE TABLE вообще select нельзя написать, хоть со звездой, хоть без. И что ?
...
Рейтинг: 0 / 0
Помогите с запросом новичку...
    #38712191
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
по поводу всевозможных домыслов есть отличная сказочка
вроде дело было куда проще, чем create view with schemabinding

да, я тоже думаю, лень им было выцеплять основной селект,
поэтому и подзапрос тоже на предмет звезды шерстит.
но прикольно: если в основной селект зафигасить '*' (как строку, в кавычках, ну мало-ли, для красоты вывода),
то такую закавыченную звезду пропускает
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом новичку...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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