• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Опять запрос

  • Автор темы Renat11111
  • Дата начала
R

Renat11111

Опять элементарная проблема с запросом. очень туго поддаюсь процессу обучения )))

из таблицы Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной нужны мне все сотрудники, а таблицу
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена использую для того чтобы
получить сумму ВыплаченностьЗарплаты = &Выплачено.
тоесть имеем например 10 сотрудников с общей суммой 20000
из них токо у 9 ВыплаченностьЗарплаты = &Выплачено.
вроде и понимаю я что своим условием соединения отсекаю одного сотрудника у меня выбирает 9 сотрудников
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено
Но ниче придумать не могу.

|ВЫБРАТЬ
| Основной.НомерСтроки КАК НомерСтроки,
| Основной.Сотрудник.ФизЛицо КАК СсылкаФизЛицо,
| Основной.НомерКарточки КАК НомерКарточки,
| ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Фамилия) ЕСТЬ NULL
| ТОГДА Основной.Сотрудник.Физлицо.Наименование
| ИНАЧЕ ФИОФизЛицСрезПоследних.Фамилия + "" "" + ФИОФизЛицСрезПоследних.Имя + "" "" + ФИОФизЛицСрезПоследних.Отчество
| КОНЕЦ КАК ФизЛицо,
| ВЫБОР КОГДА Основной.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Задепонировано)
| ТОГДА ""Задепонировано""
| ИНАЧЕ """"
| КОНЕЦ КАК ЗаписьОДепонировании,
| Основной.Сотрудник.Код КАК ТабельныйНомер,
| СУММА(Основной.Сумма) КАК СУММА,
| СУММА(ЗарплатаВыплачена.Сумма) КАК СуммаОплачено
|ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной
|
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, Физлицо В (ВЫБРАТЬ РАЗЛИЧНЫЕ Основной.Сотрудник.Физлицо КАК Физлицо ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной ГДЕ Основной.Ссылка = &ДокументСсылка )) КАК ФИОФизЛицСрезПоследних
|ПО Основной.Сотрудник.Физлицо = ФИОФизЛицСрезПоследних.ФизЛицо
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена
|ПО Основной.Сотрудник.Физлицо= ЗарплатаВыплачена.Сотрудник.Физлицо
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено
|ГДЕ Основной.Ссылка = &ДокументСсылка
| И Основной.СпособВыплаты = &ЧерезБанк
| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка
| И ЗарплатаВыплачена.СпособВыплаты = &ЧерезБанк
|
|СГРУППИРОВАТЬ ПО
| Основной.НомерСтроки,
| Основной.Сотрудник.ФизЛицо,
| Основной.НомерКарточки,
| ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Фамилия) ЕСТЬ NULL
| ТОГДА Основной.Сотрудник.Физлицо.Наименование
| ИНАЧЕ ФИОФизЛицСрезПоследних.Фамилия + "" "" + ФИОФизЛицСрезПоследних.Имя + "" "" + ФИОФизЛицСрезПоследних.Отчество
| КОНЕЦ,
| ВЫБОР КОГДА Основной.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Задепонировано)
| ТОГДА ""Задепонировано""
| ИНАЧЕ """"
| КОНЕЦ,
| Основной.Сотрудник.Код
|
|УПОРЯДОЧИТЬ ПО
| Основной.НомерСтроки
|";
 
U

unknown181538

Почему нельзя исползовать одну таблицу? Если сумму нужно получать только когда зп выплачена, используйте конструкцию "ВЫБОР... КОГДА".
 
T

tanat

Если я не ошибаюсь, то можно использовать ПРАВОЕ СОЕДИНЕНИЕ
 
P

puh14

|ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной
|
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, Физлицо В (ВЫБРАТЬ РАЗЛИЧНЫЕ Основной.Сотрудник.Физлицо КАК Физлицо ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной ГДЕ Основной.Ссылка = &ДокументСсылка )) КАК ФИОФизЛицСрезПоследних
|ПО Основной.Сотрудник.Физлицо = ФИОФизЛицСрезПоследних.ФизЛицо
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена
|ПО Основной.Сотрудник.Физлицо= ЗарплатаВыплачена.Сотрудник.Физлицо
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено

|ГДЕ Основной.Ссылка = &ДокументСсылка

| И Основной.СпособВыплаты = &ЧерезБанк
| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка

Что-то я юмора не понял - ты два раза выбираешь данные из одного и того-же документа. Зачем так?

а режет у тебе скорее всего на ГДЕ ибо левое соединение только null сделать могёт

| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка
| И ЗарплатаВыплачена.СпособВыплаты = &ЧерезБанк

поскольку сильно подозреваю, что в при отсутствии зарплаты банка у тебя нет

тебе тогда проще из регистра сведений левым соединением в документ прыгать с условиями на ссылки, банки и т.д.
 
R

Renat11111

Ответившим спасибо, уже сам разобрался.
 
V

vitfil

Если я не ошибаюсь, то можно использовать ПРАВОЕ СОЕДИНЕНИЕ
я бы порекомендовал крайне редко его использовать...
исходя хотя бы из того, как будет построен план запроса...
 
T

tanat

я бы порекомендовал крайне редко его использовать...
исходя хотя бы из того, как будет построен план запроса...

А есть существенные отличия? Я всегда считал, что ЛЕВОЕ или ПРАВОЕ соединение - это лишь правило, по которому объединяются 2 таблицы. Если левое - то берутся все колонки из таблицы, указанной слева от записи СОЕДИНЕНИЕ, если ПРАВОЕ- то из той, что справа?
Все зависит от порядка указания таблиц...
Или может я не понял сути замечания? :)
 
V

vitfil

Ну представьте себе, что есть объединение... Поясню на примере.

Допустим имеются 2 таблицы:
Т1
Код:
А  В
1  123
2  227
3  200
4  222

Т2
Код:
А  В
1  123
9  229
3  200
7  224
1  227

Код:
select * from t1 left join t2 on t1.a = t2.a

Получаем следующую таблицу:
Код:
т1.а  т1.В  т2.А  Т2.В
1	  123	1	  123
2	  227
3	  200	3	  200
4	  222

Код:
select * from t1 right join t2 on t1.a = t2.a

Получаем следующую таблицу:
Код:
т1.а  т1.В  т2.А  Т2.В
1	  123	1	  123
9	  229
3	  200	3	  200
7	  224
1	  123	1	  227

И что получается? Делая выборку из Т1, фактически получаем выборку из Т2 с левым соединением с таблицей Т1. Хотя на самом деле требовалась выборка из таблицы Т1.
 
T

tanat

И что получается? Делая выборку из Т1, фактически получаем выборку из Т2 с левым соединением с таблицей Т1. Хотя на самом деле требовалась выборка из таблицы Т1.

Я это и имел ввиду, говоря о порядке таблиц). Особой разницы я все равно не вижу. Если задача позволяет пользоваться ПРАВЫМ и вы понимаете, какой результат в итоге получите - почему бы не воспользоватсья?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!