Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) аналог слова "Все" или "Вошедшие в запрос" (число прочтений - 22469 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #15 - 19. Октября 2012 :: 07:47
Печать  
Vlad7131 писал(а) 19. Октября 2012 :: 05:05:
Привет! Спасибо за дельные советы по SQL. Что в SELECT
можно использовать into я и не знал, сейчас нашел в книге Фленова into, но в операторе  
"INSERT INTO Имя Таблицы", это то же самое, просто insert опущено, или нет?

"INSERT INTO Имя Таблицы" - это добавление строк в УЖЕ СУЩЕСТВУЮЩУЮ таблицу
SELECT INTO - это СОЗДАНИЕ таблицы и добавление строк в нее.



Цитата:
Где взять GUID для использования в качестве имени таблицы?


Код
Выбрать все
Функция GUID() Экспорт
	GUID = СоздатьОбъект("Guid");
	GUID.Новый();

	Возврат GUID.ВСтроку();
КонецФункции	// GUID
 



Соответственно, текст запроса выглядит как
стрИмяВТ = "[#" + GUID() + "]";
ТекстЗапроса = "бла-бла-бла FROM " + стрИмяВТ + " бла-бла-бла";


Цитата:
В этой конструкции, где две таблицы через запятую:
Select* From
  (select distinct Товар from ВТ) ВсеТовары,
  (select distinct Склад from ВТ) ВсеСклады
это и есть декартово произведение, cross join писать не надо?

Точный синтаксис уже не помню, может это Оракловская запись кросс-джойна.
А по сути, да - кросс-джойн == декартово произведение.
А не помню, ибо кросс-джойны - зло.
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #16 - 20. Октября 2012 :: 04:27
Печать  
Satans Claws писал(а) 19. Октября 2012 :: 07:47:
...
А не помню, ибо кросс-джойны - зло.

Обоснуй Улыбка
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #17 - 20. Октября 2012 :: 07:02
Печать  
Добрый день!
Сформировал временную таблицу
SELECT .... INTO [#ВТ]
Сделал запрос:
     "SELECT * FROM #ВТ";
Вывел запрос в ТЗ на форму.
Выдает таблицу с четырьмя колонками: СпрНом, Тов, Скл, ОстатокТовара, строки со значениями тоже есть.

А запрос: "SELECT Тов FROM #ВТ";
равно как и запрос: "SELECT Таб1.Тов FROM #ВТ Таб1";
выдает ошибку: [SQL Server]Invalid column name 'Тов'.

Подскажите в чем дело, как же обратиться к конкретной колонке?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #18 - 20. Октября 2012 :: 09:57
Печать  
Обращаться также, как и создал. Код создания тут: SELECT .... INTO [#ВТ], нам того, что у тебя за точками скрыто, отсюда не видать
  
Наверх
ICQ  
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #19 - 20. Октября 2012 :: 11:26
Печать  
Привет! Спасибо за поддержку.
Очень долго не мог понять, методом "тыка" дошел, что
вот так  "SELECT  РегОстатки.Товар as Тов into #BT" можно потом обратиться к полю Тов, а вот так уже нельзя:
"SELECT РегОстатки.Товар as [Тов $Справочник.Номенклатура] into #BT," Как обратиться к полю во втором случае - не знаю, подскажите, если как то можно. Вобщем результат получил, правда с помощью трех запросов и двух ВТ.
Вот такой запрос не проканал:
     |      SELECT
     |      ВсеТовары.TOV as Товар,
     |      ВсеСклады.SKL as Склад
     //|      into [#ВТ2]
     |      IsNull(#ВТ.OST, 0) Остаток
     |      FROM
     |      (SELECT DISTINCT TOV FROM #ВТ) ВсеТовары,  
     |      (SELECT DISTINCT SKL FROM #ВТ) ВсеСклады
     |      LEFT JOIN #ВТ on #ВТ.TOV=ВсеТовары.TOV and #ВТ.SKL=ВсеСклады.SKL", не прошло обращение к #BT.OST
хотя псевдоним остатка  в первой ВТ был в селекте такой:
|            РегОстатки.ОстатокТовараОстаток as OST
Тоже загадка, пришлось это все в ВТ2 и уж потом еще 1 запрос.
Может поменять обращение к #BT на обращение через псевдоним, добавить (SELECT * FROM #BT) Остатки, и тогда  переписать IS NULL(Остатки.OST, 0) Остаток ?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #20 - 21. Октября 2012 :: 14:40
Печать  
1. Во втором случае можно обратиться к полю так:
SELECT [Тов $Справочник.Номенклатура] FROM #BT
2. Смысла в записи в квадратные скобки и типизации полей при укладывании во временную таблицу или при организации вложенной выборки - нет. Типизация нужна только при формировании окончательной выборки, которая будет непосредственно выгружена в 1С.
  
Наверх
ICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #21 - 22. Октября 2012 :: 03:19
Печать  
Цитата:
Satans Claws писал(а) 19. Октября 2012 :: 07:47:
...
А не помню, ибо кросс-джойны - зло.

Обоснуй Улыбка


Ибо бедумное декартово произведение создает выборки охрененных размеров. Особенно, если декартятся не 2, а 3 и более источника.
Использовать же кросс-джойны в качестве неявных лефт/райт/иннер-джойнов - просто моветон.

А реальных задач, когда действительно требуется кросс-джойн - исчезающе мало.
Даже в текущей задаче - нефиг делать это на скуле. Кросс-таблицу надо реализовывать на клиенте.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #22 - 22. Октября 2012 :: 05:50
Печать  
Добый день.
Помогите разобраться с запросом:      
     ТекстЗапроса="
     |      SELECT  
     |        РегОстатки.Товар as      TOV,
     |            РегОстатки.Склад as SKL,
     |            РегОстатки.ОстатокТовараОстаток as OST
     |      into [#ВТ]
         |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
         |, (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки";

       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  
         
     ТекстЗапроса="
     |      SELECT
     |      ВсеТовары.TOV as Товар,
     |      ВсеСклады.SKL as Склад,
     |      IsNull(Все.OST, 0) Остаток
     |      FROM
     |      (SELECT DISTINCT TOV FROM #ВТ) ВсеТовары,  
     |      (SELECT DISTINCT SKL FROM #ВТ) ВсеСклады
//      |      (SELECT * FROM #ВТ) Все
     |      Full Join #ВТ on #ВТ.TOV=ВсеТовары.TOV AND #ВТ.SKL=ВсеСклады.SKL";

     Выдает ошибку: The multi-part identifier "#ВТ.TOV" could not be bound.
Псевдоним в строке "(SELECT * FROM #ВТ) Все", если убрать комментарий и закомментировать последнюю строку, спасает и
запрос работает, но результат то другой. А сделать псевдоним в Join-е "Full Join #ВТ as Все on Все.TOV=ВсеТовары.TOV AND Все.SKL=ВсеСклады.SKL"
не получается, выдает ошибку: The multi-part identifier "ВсеТовары.TOV" could not be bound. Т.е. даже внутренние select-ы не отработали.
Пока удалось сделать желаемую выборку с помощью 3 запросов и двух временных таблиц. Наверно это не очень оптимально.

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #23 - 22. Октября 2012 :: 07:54
Печать  
(Vlad7131) Если делать без аналога все вошедшие то какой предполагаемое число строк ???

PS Т.е. Если скажем выводишь в виде
таблицы строки товары , столбцы склады и без групп  то может уже
и ничего и не надо делать.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #24 - 22. Октября 2012 :: 08:08
Печать  
Это смотря что будет в ВыбТовар и ВыбСклад, можно в отчете указать 1 товар, а можно группу или даже несколько групп.
"Все вошедшие" увеличивает выборку, включая товары с нулевыми остатками. Тренируюсь на примере из 2 товаров на 3 складах.
Без "Все вошедшие" 5 строк: 1 товар есть на всех 3 складах, а один на двух. Со "Всеми вошедшими" строк будет 6, по 3 строки для каждого товара для каждого из 3 складов вошедших в запрос для первого товара. Вообще в базе складов около 25.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #25 - 22. Октября 2012 :: 08:13
Печать  
Да не тренировочная это задача.

Если объем выходных строк без все вошедшие
до 10 000 строк то пиши все на клиенте ( в самой 1с)
через ТЗ или ИТЗ.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #26 - 22. Октября 2012 :: 08:15
Печать  
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #27 - 22. Октября 2012 :: 08:22
Печать  
Через ТЗ: я не знаю как добавить недостающие строки по складам с 0, с использованием ИТ - может что и получится, хотя вряд ли будет лучше, чем с 2 временными таблицами.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #28 - 22. Октября 2012 :: 08:27
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:15:
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.


Если делать без всяких вошедшие
у Вас в 1с есть уже таблица ТЗ с остатками по товарам и складам.
Отсортируйте ее по Товар, Склад.

Далее для нового товара выводите
колонку товар и все колонки складов с пустым колвом.
далее для каждого склада выведите
в  нужную колонку остаток этого склада.
Все. ( только не знаю насколько понятен мой ответ )


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


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #29 - 22. Октября 2012 :: 08:52
Печать  
Дело в том, что ТЗ имеет 3 колонки: товар, склад и остаток.
И для каждого товара - разное количество и состав складов.
Поэтому при выводе "всех" складов для каждого товара получится чехарда. Например : товар1, склад3, склад6, а под этой строкой: Товар2, склад1, склад4, склад8. И т.д. С помощью ТЗ у меня очтет давно написан и работает, но получилось не совсем просто, мягко говоря. А цель работы - скорость.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 6
ОтправитьПечать