Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) громоздкий запрос (число прочтений - 8153 )
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #30 - 18. Июня 2009 :: 12:34
Печать  
Прочитал. Все равно не понимаю. На пальцах.
Таблица Рег
Товар      БазСтоим
1      2.0
2      2.1
3      2.2

Теблица ВРег1
Товар      ВалСтоим
1      3.0
2      3.1
4      3.2
мои представления об операторе Join таковы:

select Товар,БазСтоим,ВалСтоим from Рег left Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0

select Товар,БазСтоим,ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
4      0       3.2

select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0
4      0       3.2

поле Товар у нас одно.
Объясните, в чем я не прав
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #31 - 18. Июня 2009 :: 12:44
Печать  
select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0
4      0       3.2

1. такой запрос ругнется на поле "товар", т.к. это поле есть в Рег и в Врег1
2. Если написать
select Рег1.Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
получим
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       NULL
NULL  NULL   3.2

вы пример мой пробовали запускать в QA?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #32 - 18. Июня 2009 :: 12:50
Печать  
зы: тока ж не fool join:)
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #33 - 18. Июня 2009 :: 13:01
Печать  
хм... начинаю понимать.
тогда
1 select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар ругнется на все три по сути. Да?
2. ваш пример - select Рег1.Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар ругнется на БазСтоим,ВалСтоим.
3. select рег.Товар,рег.БазСтоим,рег.ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар ругнется на ВалСтоим, т.к. в Рег этого поля нет.

и единственно верно
select coalesce(рег.Товар,врег1.товар) as товар ,рег.БазСтоим,рег.ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар.

тогда можно еще пару вопросов.
1. как делать Group by по товару?
2. что будет при Joinе если у таблиц совпадает несколько полей? например Товар и ВалСт?
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #34 - 18. Июня 2009 :: 13:02
Печать  
alexdd писал(а) 18. Июня 2009 :: 12:50:
зы: тока ж не fool join:)

Смех да, точно. это немного другое слово

  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #35 - 18. Июня 2009 :: 13:12
Печать  
упс, да сорь. Рег1 там нет, не заметилУлыбка
насчет group by:
Код
Выбрать все
select
 coalesce(рег.Товар,врег1.товар) as товар,
 sum(рег.БазСтоим) БазСтоим,
 sum(врег1.ВалСтоим) ВалСтоим
from
 Рег
full Join
 Врег1 on рег.товар = врег1.товар
group by
 coalesce(рег.Товар,врег1.товар)
 

  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #36 - 18. Июня 2009 :: 13:15
Печать  
alexdd писал(а) 18. Июня 2009 :: 13:12:
упс, да сорь. Рег1 там нет, не заметилУлыбка
насчет group by:
Код
Выбрать все
select
 coalesce(рег.Товар,врег1.товар) as товар,
 sum(рег.БазСтоим) БазСтоим,
 sum(врег1.ВалСтоим) ВалСтоим
from
 Рег
full Join
 Врег1 on рег.товар = врег1.товар
group by
 coalesce(рег.Товар,врег1.товар)
 



я сейчас уже так попробовал - нет, ошибку выдает.
думаю теперь это все в подзапросом что ли сделать
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #37 - 18. Июня 2009 :: 13:22
Печать  
а пройдет ли вариант
select
гот.Товар,
гот.БазСтоим,
гот.ВалСтоим
from
    (select Товар,БазСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар) as Гот
group by
гот.товар

особенно волнует тот момент, что в подзапросе (select Рег.Товар,Рег.БазСтоим from Рег...) я не стал указывать ВалСтоим.
но ведь по идее в таблице Гот поле ВалСтоим будет
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #38 - 18. Июня 2009 :: 13:42
Печать  
по поводу QA - это SQL Query analyzer кака я понимаю.
Я знаю, что такая штука есть, но не умею им пользоваться.Улыбка

сейчас вот запустил его, тут по умолчанию окно текстовое открыто: скопировал туда отпарсенный текст из отладки. он у меня раскрасился разными цветами.
что теперь? как запустить?
п.с. sql server 2000, sql-администрирование не знаю, этим другие люди занимаются.
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #39 - 18. Июня 2009 :: 16:17
Печать  
С запросом разобрался.
C QA тоже.

Спасибо всем.

Вопрос.
В QA не воспринимает вещи типа #ВыбГруппа.
Хотя это уже попарсено.
Можно как-то бороться?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #40 - 18. Июня 2009 :: 17:40
Печать  
#ВыбГруппа это временная таблица. осталось еще разобраться с профайлером (Profiler) и посмотреть как эта таблица формируется. Потом тот же код(почти) можно выполнить в QA
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать