Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Прямые запросы к БД: Получить Primary Key

v7: Прямые запросы к БД: Получить Primary Key
Я
   OnePrg
 
28.09.21 - 09:33
Как в запросе к таблице БД добавить столбец со значением Primary Key?
   OnePrg
 
1 - 28.09.21 - 09:34
SQL
   ADirks
 
2 - 28.09.21 - 09:35
(0) вот интересно, а откуда ты узнал про Primary Key?
   mikecool
 
3 - 28.09.21 - 09:36
(0) кто есть PK в твоей таблице? вот его и добавляй
   pechkin
 
4 - 28.09.21 - 09:39
Alter table
   OnePrg
 
5 - 28.09.21 - 09:41
(3) а если PK состоит из нескольких полей?

мне нужно выбрать записи из таблицы и в зависимости от значений двух полей в ней и удалить эти записи

если удалять по одной, то долго, хочу собрать в список все PK и удалить одним запросом
   Ёпрст
 
6 - 28.09.21 - 09:42
(5) годная трава
   OnePrg
 
7 - 28.09.21 - 09:42
   youalex
 
8 - 28.09.21 - 09:49
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
   ДенисЧ
 
9 - 28.09.21 - 09:50
А зачем в запросе добавлять ПК?
Он уже есть. Только в таблице...
   Ёпрст
 
10 - 28.09.21 - 09:51
(7) и ?
Конечная цель какая? Тебе же вроде Майк давал готовое изделие по очистке таблички регистрации объектов.
   OnePrg
 
11 - 28.09.21 - 09:52
(4) мне не нужно изменять саму таблицу БД, мне нужно выбрать запросом поля таблицы и левым соединением прикрутить ещё уникальный идентификатор записи таблицы
   OnePrg
 
12 - 28.09.21 - 09:53
(10) Не нахожу у себя, бл....! Покорно прошу сбросить ещё раз.
   ДенисЧ
 
13 - 28.09.21 - 09:54
(11) Открой свойства твоего ПК и добавь в запрос колонки из него
   ADirks
 
14 - 28.09.21 - 10:06
(11) трава ваще годная, уважаю
   mikecool
 
15 - 28.09.21 - 10:08
(5) если два твоих поля есть в РК, и если они идут в порядке друг за другом - РК итак будет использован
даже если не по порядку )
   ДенисЧ
 
16 - 28.09.21 - 10:08
(14) Трава такого не даёт. Это грибы...
   mikecool
 
17 - 28.09.21 - 10:09
(16) снимаю шляпу перед экспертом
   OnePrg
 
18 - 28.09.21 - 10:10
Сейчас я удаляю записи из таблицы так: выгружаю таблицу в таблицу значений, перебираю её, по двум полям определяю запись, которую нужно удалить и удаляю

                    ТекстЗапроса = "
                    |DELETE
                    |    _1SUPDTS
                    |FROM
                    |    _1SUPDTS as U
                    |WHERE
                    |    U.OBJID=:OBJID AND U.DBSIGN=:DBSIGN";
                    RS.УстановитьТекстовыйПараметр("OBJID",  тбОбмен.OBJID);
                    RS.УстановитьТекстовыйПараметр("DBSIGN", тбОбмен.DBSIGN);
                    RS.ВыполнитьИнструкцию(ТекстЗапроса);


Хочу сделать это одним запросом, а не запросом в цикле.
   mikecool
 
19 - 28.09.21 - 10:13
delete
from
where (поле1, поле2) in(набор пар)
   OnePrg
 
20 - 28.09.21 - 10:14
(19) а набор пар как задать?
   Ёпрст
 
21 - 28.09.21 - 10:15
https://infostart.ru/public/15830/
Как вариант, ибо Майка выиезали с нимфостарта
   Ёпрст
 
22 - 28.09.21 - 10:16
(18) ну в запросе, в котором определяешь, замени select на delete
   Ёпрст
 
23 - 28.09.21 - 10:16
Усё
   Mikeware
 
24 - 28.09.21 - 10:20
(12) ты издеваешься, чтоль? просмотреть пяток своих же тем - что тебе не позволяет?????
Зависание обмена РиБ
   Mikeware
 
25 - 28.09.21 - 10:20
(21) кстати, непонятно почему
   youalex
 
26 - 28.09.21 - 10:25
(18) создай из таблицы временную (как в твоем контексте это сделать - не знаю синтаксис)
 и сделай join c ней 

DELETE U
FROM _1SUPDTS as U
JOIN #t t
  on U.OBJID = t.OBJID AND U.DBSIGN = t.DBSIGN
   OnePrg
 
27 - 28.09.21 - 10:55
(22) спасибо, втупил, искал по названию темы и не сообразил, тема-то была про зависание обмена
   OnePrg
 
28 - 28.09.21 - 11:51
(26) как можно таблицу значений запихнуть во временную таблицу в прямых запросах? можно пример

SELECT
  *
INTO #t
FROM
  :tabl as t;

так правильно?
   OnePrg
 
29 - 28.09.21 - 11:53
А вот нашёл

ТЗ = СоздатьОбъект("ТаблицаЗначений");
     ТЗ.НоваяКолонка("Раз");
     ТЗ.НоваяКолонка("Два");
     Для сч = 1 По 100 Цикл
           ТЗ.НоваяСтрока();
           ТЗ.Раз = сч;
           ТЗ.Два = сч * 5;
     КонецЦикла;
     
     Запрос = СоздатьОбъект("ODBCRecordset");
     Запрос.Выполнить("
     |create table MyTable(Раз int, Два int)");
     Запрос.Подготовить("
     |insert into MyTable(Раз, Два)
     |values(?, ?)");
     Запрос.ВыполнитьSQL_ИзТЗ(ТЗ);
     
     ТЗ1 = Запрос.ВыполнитьИнструкцию("select * from MyTable");
     ТЗ1.ВыбратьСтроку();
     Запрос.Выполнить("drop table MyTable");


Всем спасибо.
   OnePrg
 
30 - 01.10.21 - 06:45
(19)

   |DELETE
   |    _1SUPDTS
   |FROM
   |    _1SUPDTS as U
   |WHERE (U.OBJID, U.DBSIGN) in (SELECT val FROM #тбУдалять as тбУдалять)


Рядом с "," в контексте, где ожидается условие, указано выражение типа, отличного от логического.
 
 
   OnePrg
 
31 - 01.10.21 - 06:52
Получилось

    //***************************************

    //     создаём временную таблицу склады

    //***************************************

    тбСкладыЗаполнить();
    //тбСклады.ВыбратьСтроку();

    RS = СоздатьОбъект("ODBCRecordset"); 
    RS.ВыполнитьСкалярный("
          |IF OBJECT_ID('tempdb..#ТаблВрем', 'U') IS NOT NULL
          |  DROP TABLE #ТаблВрем;
          |CREATE TABLE #ТаблВрем (КодИБ Char(3),Склад int);");
    RS.Подготовить("
      |insert into #ТаблВрем(КодИБ, Склад)
      |values(?, ?)");
    RS.ВыполнитьSQL_ИзТЗ(тбСклады);
    
    ТекстЗапроса = "
    |SELECT
    |    U.OBJID as [Док $Документ],
    |    J.IDDocDef as Док_вид,
    |   Склады.ID as [Склад $Справочник.МестаХранения],                            
    |   U.DBSIGN,
    |   U.OBJID
    |FROM
    |    _1SUPDTS as U
    |INNER JOIN
    |    _1Sjourn as J ON U.TypeID=J.IDDocDef And U.OBJID=J.IDDoc
    |LEFT JOIN
    |    #ТаблВрем as ТаблВрем ON U.DBSIGN=ТаблВрем.КодИБ
    |LEFT JOIN
    |    $Справочник.МестаХранения as Склады ON ТаблВрем.Склад = Склады.Code";
    
    тбОбмен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
    //тбОбмен.ВыбратьСтроку();

    //Возврат;

    Сообщить(тбОбмен.КоличествоСтрок());   
    
    //спКодИБ_НетСклада    = СоздатьОбъект("СписокЗначений");


    тбУдалять = СоздатьОбъект("ТаблицаЗначений");
    тбУдалять.НоваяКолонка("OBJID");
    тбУдалять.НоваяКолонка("DBSIGN");
    
    тбОбмен.ВыбратьСтроки();
    Пока тбОбмен.ПолучитьСтроку()=1 Цикл         
        Удалять = 0;
        Если ПустоеЗначение(тбОбмен.Склад) = 1 Тогда
            Удалять = 1;
        ИначеЕсли ДокументСклада(тбОбмен.Док,тбОбмен.Склад) = 0 Тогда
            Удалять = 1;
        КонецЕсли;
        
        Если Удалять = 1 Тогда
            тбУдалять.НоваяСтрока();
            тбУдалять.OBJID     = тбОбмен.OBJID;
            тбУдалять.DBSIGN     = тбОбмен.DBSIGN;
        КонецЕсли;
    КонецЦикла;
    
    RS.ВыполнитьСкалярный("
          |IF OBJECT_ID('tempdb..#тбУдалять', 'U') IS NOT NULL
          |  DROP TABLE #тбУдалять;
          |CREATE TABLE #тбУдалять (OBJID Char(9),DBSIGN Char(3));");
    RS.Подготовить("
      |insert into #тбУдалять(OBJID, DBSIGN)
      |values(?, ?)");
    RS.ВыполнитьSQL_ИзТЗ(тбУдалять);

    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN 
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    RS.ВыполнитьИнструкцию(ТекстЗапроса);

    
    //***************************************

    //     очищаем справоник переоценки

    //***************************************


    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U2
    |INNER JOIN
    |    $Справочник.Переоценки as Переоценки ON U2.TypeID=3494 And  U2.OBJID=Переоценки.ID
    |LEFT JOIN
    |    #ТаблВрем as ТаблВрем ON U2.DBSIGN=ТаблВрем.КодИБ
    |LEFT JOIN
    |    $Справочник.МестаХранения as Склады ON ТаблВрем.Склад = Склады.Code
    |WHERE
    |   Склады.ID <> $Переоценки.Склад";
    тбОбмен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
   Ёпрст
 
32 - 01.10.21 - 10:24
(31) все в топку.
Временная табличка там не нужна, подготовленный текс запроса тоже, кучка запросов и между ними код, тоже.
Выкинуть всё. Написать ОДИН запрос на delete из таблички упдс по условию. Усё.
   OnePrg
 
33 - 01.10.21 - 10:36
(32) в следующий раз может быть так и сделаю
сейчас задача достигнута - вместо часа 5 минут
и что переделка улучшит? пару секунд быстрее?
   OnePrg
 
34 - 01.10.21 - 10:38
(32) для чего код нужен был - чтобы привязать код ИБ к складу
как это можно без кода сделать?
добавить в склад реквизит "КодИБ"?
   OnePrg
 
35 - 01.10.21 - 10:41
(32)
+ нужно определять принадлежит ли этот документ Складу не только по шапке но и для некоторых документов по табличной части
   Ёпрст
 
36 - 01.10.21 - 11:22
(33) вот так и будешь г..о кодить, даже с наличием хорошего инструмента.
   Ёпрст
 
37 - 01.10.21 - 11:22
И ты не поверишь, но прямые запросы тоже надо оптимизировать
   ДенисЧ
 
38 - 01.10.21 - 11:24
(37) Что за ересь ты гонишь? На каждом заборе написано, что прямые запросы рулят.
А тут ещё, оказывается, их оптимизировать надо...
   Ёпрст
 
39 - 01.10.21 - 11:27
(38) а точно, совсем забыл. Да из коробки же..как и снеговик )
   Arbuz
 
40 - 01.10.21 - 15:11
Вот есть молоток для забивания гвоздей. Берём гвозди раскладываем кучками в виде пентаграмм. Кидаем кубики-зарики. Свистим в свисток сколько выпало. Мажем ручку молотка клеем. Сначала засовываем на сколько можем гвоздь плоскогубцами. Потом забиваем молотком. Работает же - цель достигнута!
   youalex
 
41 - 01.10.21 - 15:16
(37) Вообще-то,  ТС и оптимизировал (без иронии)
Как я понял, у него был delete в цикле (со всеми накладными расходами), а он сделал его джойном с вт.
То что оптимизация не оптимальна ("вместо часа 5 минут") - а могло бы и 1 минут, уже следующий вопрос.
   Ёпрст
 
42 - 01.10.21 - 15:24
(41) ага, заместо взять готовый код и переписать под себя, изобретает велосипед
   Arbuz
 
43 - 01.10.21 - 15:28
(41) ага, оптимизируем - выкидываем из моего алгоритма кубики и свисток ))))))
   youalex
 
44 - 01.10.21 - 16:09
(43) Пентаграммой было бы создать в скуле хранимку (если прав хватит, то и из 1С) , и дергать ее из 1С, отдавая на вход данные тбСклады в xml
   Arbuz
 
45 - 01.10.21 - 16:16
(44) А как же микросервис на Go?
   Arbuz
 
46 - 01.10.21 - 16:24
+(45) отдаёшь ему POST'ом JSON, а он тебе времянку в скуле.
Если к ж#пе присобачить сопроцессор фирмы CRAY, можно с#ать в два унитаза в сорок тысяч раз быстрей (с)


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.