|
v7: Прямые запросы к БД: Получить Primary Key | ☑ | ||
---|---|---|---|---|
0
OnePrg
28.09.21
✎
09:33
|
Как в запросе к таблице БД добавить столбец со значением Primary Key?
|
|||
1
OnePrg
28.09.21
✎
09:34
|
SQL
|
|||
2
ADirks
28.09.21
✎
09:35
|
(0) вот интересно, а откуда ты узнал про Primary Key?
|
|||
3
mikecool
28.09.21
✎
09:36
|
(0) кто есть PK в твоей таблице? вот его и добавляй
|
|||
4
pechkin
28.09.21
✎
09:39
|
Alter table
|
|||
5
OnePrg
28.09.21
✎
09:41
|
(3) а если PK состоит из нескольких полей?
мне нужно выбрать записи из таблицы и в зависимости от значений двух полей в ней и удалить эти записи если удалять по одной, то долго, хочу собрать в список все PK и удалить одним запросом |
|||
6
Ёпрст
28.09.21
✎
09:42
|
(5) годная трава
|
|||
7
OnePrg
28.09.21
✎
09:42
|
||||
8
youalex
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) и ?
Конечная цель какая? Тебе же вроде Майк давал готовое изделие по очистке таблички регистрации объектов. |
|||
11
OnePrg
28.09.21
✎
09:52
|
(4) мне не нужно изменять саму таблицу БД, мне нужно выбрать запросом поля таблицы и левым соединением прикрутить ещё уникальный идентификатор записи таблицы
|
|||
12
OnePrg
28.09.21
✎
09:53
|
(10) Не нахожу у себя, бл....! Покорно прошу сбросить ещё раз.
|
|||
13
ДенисЧ
28.09.21
✎
09:54
|
(11) Открой свойства твоего ПК и добавь в запрос колонки из него
|
|||
14
ADirks
28.09.21
✎
10:06
|
(11) трава ваще годная, уважаю
|
|||
15
mikecool
28.09.21
✎
10:08
|
(5) если два твоих поля есть в РК, и если они идут в порядке друг за другом - РК итак будет использован
даже если не по порядку ) |
|||
16
ДенисЧ
28.09.21
✎
10:08
|
(14) Трава такого не даёт. Это грибы...
|
|||
17
mikecool
28.09.21
✎
10:09
|
(16) снимаю шляпу перед экспертом
|
|||
18
OnePrg
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.ВыполнитьИнструкцию(ТекстЗапроса); Хочу сделать это одним запросом, а не запросом в цикле. |
|||
19
mikecool
28.09.21
✎
10:13
|
delete
from where (поле1, поле2) in(набор пар) |
|||
20
OnePrg
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
|
Усё
|
|||
24
Mikeware
28.09.21
✎
10:20
|
(12) ты издеваешься, чтоль? просмотреть пяток своих же тем - что тебе не позволяет?????
Зависание обмена РиБ |
|||
25
Mikeware
28.09.21
✎
10:20
|
(21) кстати, непонятно почему
|
|||
26
youalex
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 |
|||
27
OnePrg
28.09.21
✎
10:55
|
(22) спасибо, втупил, искал по названию темы и не сообразил, тема-то была про зависание обмена
|
|||
28
OnePrg
28.09.21
✎
11:51
|
(26) как можно таблицу значений запихнуть во временную таблицу в прямых запросах? можно пример
SELECT * INTO #t FROM :tabl as t; так правильно? |
|||
29
OnePrg
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"); Всем спасибо. |
|||
30
OnePrg
01.10.21
✎
06:45
|
(19)
|DELETE | _1SUPDTS |FROM | _1SUPDTS as U |WHERE (U.OBJID, U.DBSIGN) in (SELECT val FROM #тбУдалять as тбУдалять) Рядом с "," в контексте, где ожидается условие, указано выражение типа, отличного от логического. |
|||
31
OnePrg
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 из таблички упдс по условию. Усё. |
|||
33
OnePrg
01.10.21
✎
10:36
|
(32) в следующий раз может быть так и сделаю
сейчас задача достигнута - вместо часа 5 минут и что переделка улучшит? пару секунд быстрее? |
|||
34
OnePrg
01.10.21
✎
10:38
|
(32) для чего код нужен был - чтобы привязать код ИБ к складу
как это можно без кода сделать? добавить в склад реквизит "КодИБ"? |
|||
35
OnePrg
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) а точно, совсем забыл. Да из коробки же..как и снеговик )
|
|||
40
Arbuz
01.10.21
✎
15:11
|
Вот есть молоток для забивания гвоздей. Берём гвозди раскладываем кучками в виде пентаграмм. Кидаем кубики-зарики. Свистим в свисток сколько выпало. Мажем ручку молотка клеем. Сначала засовываем на сколько можем гвоздь плоскогубцами. Потом забиваем молотком. Работает же - цель достигнута!
|
|||
41
youalex
01.10.21
✎
15:16
|
(37) Вообще-то, ТС и оптимизировал (без иронии)
Как я понял, у него был delete в цикле (со всеми накладными расходами), а он сделал его джойном с вт. То что оптимизация не оптимальна ("вместо часа 5 минут") - а могло бы и 1 минут, уже следующий вопрос. |
|||
42
Ёпрст
01.10.21
✎
15:24
|
(41) ага, заместо взять готовый код и переписать под себя, изобретает велосипед
|
|||
43
Arbuz
01.10.21
✎
15:28
|
(41) ага, оптимизируем - выкидываем из моего алгоритма кубики и свисток ))))))
|
|||
44
youalex
01.10.21
✎
16:09
|
(43) Пентаграммой было бы создать в скуле хранимку (если прав хватит, то и из 1С) , и дергать ее из 1С, отдавая на вход данные тбСклады в xml
|
|||
45
Arbuz
01.10.21
✎
16:16
|
(44) А как же микросервис на Go?
|
|||
46
Arbuz
01.10.21
✎
16:24
|
+(45) отдаёшь ему POST'ом JSON, а он тебе времянку в скуле.
Если к ж#пе присобачить сопроцессор фирмы CRAY, можно с#ать в два унитаза в сорок тысяч раз быстрей (с) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |