|
Можно ли сделать в запросе не соединение таблиц а исключение ? | ☑ | ||
---|---|---|---|---|
0
Taiska
20.12.13
✎
19:24
|
Можно ли сделать в запросе не соединение таблиц а исключение ?
|
|||
1
bolobol
20.12.13
✎
19:24
|
Можно
|
|||
2
Taiska
20.12.13
✎
19:25
|
т.е. по одному запросу надо выбрать все заказы, а по второму выбрать заказы которые надо исключить из первого... соединение по заказу, но надо не соединение сделать а исключение.
|
|||
3
Taiska
20.12.13
✎
19:26
|
как ?
|
|||
4
mehfk
20.12.13
✎
19:26
|
CROSS JOIN ON ...
Where Tab1.<> is null or Tab2.<> is NULL |
|||
5
bolobol
20.12.13
✎
19:26
|
Соединение надо, левое. В условиях указать, что там где из правой части = null - эти записи и нужны
|
|||
6
mehfk
20.12.13
✎
19:27
|
(2) Надо выбрать те записи из таблицы 2 которых нет в таблице 1, верно?
|
|||
7
mehfk
20.12.13
✎
19:28
|
(5) Если нужно как в (6) то правое
|
|||
8
bolobol
20.12.13
✎
19:28
|
Выбрать ЗаказыВсе.Заказ
ИЗ ЗаказыВсе КАК ЗаказыВсе Левое соединение ЗаказыИсключаемые КАК ЗаказыИсключаемые по ЗаказыВсе.Заказ = ЗаказыИсключаемые.Заказ ГДЕ ЗаказыИсключаемые.Заказ есть null |
|||
9
Taiska
20.12.13
✎
19:32
|
(6)нет надо из первой таблицы вычесть вторую... т.е. выбираем заказы в первой а во второй выбираем те заказы которые надо исключить из первой.и из первой удаляем выбранные во второй заказы.
|
|||
10
Taiska
20.12.13
✎
19:33
|
т.е. в первой изначально присутствуют заказы которые и во второй, но узнав во второй которые надо исключить исключаем их из первой.
|
|||
11
Taiska
20.12.13
✎
19:34
|
(8) спасибо...щас попробую
|
|||
12
Taiska
20.12.13
✎
19:36
|
ГДЕ ЗаказыИсключаемые.Заказ есть null это выражение убирает разьве вторые заказы из 1ой таблицы ?? это же провверка условия, а не присвоение нулевого значения ?
|
|||
13
mehfk
20.12.13
✎
19:39
|
(9) Таб1, которых нет в Таб2 ?
|
|||
14
Taiska
20.12.13
✎
19:43
|
наверно так(13)
|
|||
15
Taiska
20.12.13
✎
19:43
|
в таб 1 есть изначально и те заказазы которые в таб 2. т.е. в таб 1 к примеру 100 строк а в таб 2 - 50.. и надо из таб 1 из 100 строк вычесть 50 которые в таб2..чтобы в таб 1 осталось 50
|
|||
16
mehfk
20.12.13
✎
19:50
|
(15) Ты запутал(а) всех
ТАб1 1 2 3 4 5 Таб2 3 4 5 6 Что должно получиться? |
|||
17
Taiska
20.12.13
✎
19:52
|
должно получиться 12
|
|||
18
Taiska
20.12.13
✎
19:53
|
6 позиция нам не нужна из 2ой таблицы
|
|||
19
mehfk
20.12.13
✎
19:53
|
Может быть
1 2 ??? |
|||
20
Taiska
20.12.13
✎
19:53
|
нужно только 1 и 2
|
|||
21
mehfk
20.12.13
✎
19:54
|
или
1 2 3 4 5 |
|||
22
Taiska
20.12.13
✎
19:54
|
(19)ну да 1 и 2,
|
|||
23
Taiska
20.12.13
✎
19:54
|
1 и 2 только
|
|||
24
Taiska
20.12.13
✎
19:54
|
как это сделать ?(((( замучалась уже
|
|||
25
mehfk
20.12.13
✎
19:55
|
select
tab1.id, tab2.id from tab1 left join tab2 on tab1.id = tab2.id where tab2.id is null |
|||
26
mehfk
20.12.13
✎
19:59
|
Или так
select Tab3 From (select tab1.id as id1, tab2.id as id2 from tab1 left join tab2 on tab1.id = tab2.id) As Tab3 Where Tab3.id2 is null |
|||
27
mehfk
20.12.13
✎
19:59
|
select
Tab3 => select * |
|||
28
Taiska
20.12.13
✎
20:24
|
спасибо... но у меня еще на первую и вторую таблицу накладыватся условия
|
|||
29
Taiska
20.12.13
✎
20:25
|
ВЫБРАТЬ
//РасчетыСКлиентамиОстатки.СуммаОстаток КАК СуммаОстаток, //РасчетыСКлиентамиОстатки.КОплатеОстаток КАК КОплатеОстаток, //РасчетыСКлиентамиОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток, // РасчетыСКлиентамиОстатки.ЗаказКлиента КАК ЗаказКлиента РасчетыСКлиентами.Период КАК Период, РасчетыСКлиентами.Регистратор КАК Регистратор, РасчетыСКлиентами.Сумма КАК Сумма, РасчетыСКлиентами.КОплате КАК КОплате, РасчетыСКлиентами.КОтгрузке КАК КОтгрузке ИЗ РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами Левое СОЕДИНЕНИЕ ( выбрать РасчетыСКлиентамиОстатки.ЗаказКлиента КАК ЗаказКлиента ГДЕ РасчетыСКлиентамиОстатки.СуммаОстаток > 0 из РегистрНакопления.РасчетыСКлиентами.Остатки КАК РасчетыСКлиентамиОстатки ) как вложенныйзапрос ПО РасчетыСКлиентами.ЗаказКлиента = вложенныйзапрос.ЗаказКлиента где РасчетыСКлиентамиОстатки.ЗаказКлиента = NULL |
|||
30
mehfk
20.12.13
✎
20:33
|
а кто вам мешает сделать, например, так
select ... from (select ... from tab1 where...) as tab1 left join (select ... from tab2 where...) as tab2 on (...) left join (....) |
|||
31
mehfk
20.12.13
✎
20:34
|
последняя строчка лишняя,
замените на where tab2. is null |
|||
32
toypaul
гуру
20.12.13
✎
20:39
|
||||
33
Taiska
20.12.13
✎
20:45
|
(31) спасибо))
|
|||
34
Taiska
20.12.13
✎
20:50
|
он выдает теперь пустые строки - просто удалил оттуда заказ а строка осталась во дела... а как строки то эти удалить ?
|
|||
35
mehfk
20.12.13
✎
20:51
|
(33) Чтобы лучше представлять себе виды соедниений (JOIN) нарисуйте два облачка (множества) и потреннируйтесь эти два облачка (множества) объединять и вычитать. Если мне не изменяет память, в вики есть примеры на эту тему.
|
|||
36
Taiska
20.12.13
✎
21:00
|
спасибо всем за помощь и внимание уделенное. у меня получилось вот так:
|выбрать РасчетыСКлиентами.Регистратор.ЗаказКлиента КАК ЗАКАЗКЛИЕНТА, |РасчетыСКлиентами.Период КАК Период, |РасчетыСКлиентами.Сумма КАК Сумма, |РасчетыСКлиентами.КОплате КАК КОплате, |РасчетыСКлиентами.КОтгрузке КАК КОтгрузке | |ИЗ РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами |ГДЕ не РасчетыСКлиентами.Регистратор.ЗаказКлиента.ссылка в | |(ВЫБРАТЬ |РасчетыСКлиентамиОстатки.ЗаказКлиента ИЗ |РегистрНакопления.РасчетыСКлиентами.Остатки КАК РасчетыСКлиентамиОстатки |ГДЕ |РасчетыСКлиентамиОстатки.СуммаОстаток >0) |Упорядочить по Период |
|||
37
Kvestin
20.12.13
✎
21:41
|
Будет работать не оптимально. Не забудьте про временные таблицы и ограничение виртуальных таблиц :)
|
|||
38
Feunoir
20.12.13
✎
21:48
|
Кокой кошмар.
Либо это НЕ В (...), либо ТС не умеет формулировать вопросы. Впрочем, я уже встречал людей с сертификатом по платформе, которые ничего, на самом деле, в 1С не понимали. |
|||
39
mehfk
20.12.13
✎
21:53
|
(38) ...НЕ В... на больших объемах есть бОльшая вероятность получить неоптимальный план запроса чем с JOIN
|
|||
40
Kvestin
20.12.13
✎
21:56
|
Это еще не кошмар.
Как вам такой вариант: |ИЗ | РегистрСведений.СписанныеТовары КАК СписанныеТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровПереданные.Остатки(&Дат, | Номенклатура В | (ВЫБРАТЬ | РегистрСведений.СписанныеТовары.Номенклатура | ИЗ | РегистрСведений.СписанныеТовары | ГДЕ | РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)" + ?(ДоговорКонтрагента = Неопределено, "", " | И ДоговорКонтрагента = &ДоговорКонтрагента") + " | ) КАК ПартииТоваровПереданные |
|||
41
Kvestin
20.12.13
✎
21:58
|
Когда это увидел в стандартной УТ - был в шоке. Подумал, что база старая и потом все поправили.
Открыл УПП 1.3 и увидел тот же запрос. Если 1С себе такое позволяет, то это либо закладки для оптимизации или непрофессионализм чистой воды. |
|||
42
Taiska
20.12.13
✎
23:14
|
объединением с присвоением NULL у меня не получилоь получилось много строк но пустых... они не удалились а просто стали пустыми... поэтому пришлось способом не в
|
|||
43
Taiska
20.12.13
✎
23:14
|
тоже его нашла в какой то теме.
|
|||
44
Torquader
20.12.13
✎
23:48
|
(42) Вообще, в нормальном SQL это делается выбором из первой таблицы во временную и удалением из временной по выбору из второй - для SQL оптимальная производительность (если ключевые поля правильно выбрать).
Но, есть и "грабли" - например, если в первой таблице две одинаковых строки, а во-второй - только одна. P.S. как бы хотелось, чтобы можно было применять DELETE ко временным таблицам. |
|||
45
selenat
21.12.13
✎
09:42
|
Ну тогда по мотивам этого обсуждения
http://www.forum.mista.ru/mytopics.php?user_id=11484 могу предложить не левое соединение, а объединение с последующей группировкой и исключением лишнего. Предполагаю, что по скорости это будет оптимальный вариант. Пример замены левого соединения на этот вариант выкладывал в той ветке. |
|||
46
selenat
21.12.13
✎
10:06
|
Ошибся с ссылкой в (45). Ссылка такая
v8: Индексы в запросах. |
|||
47
selenat
21.12.13
✎
10:16
|
Что-то вроде этого получится:
ВЫБРАТЬ ВложенныйЗапрос.Заказ, СУММА(ВложенныйЗапрос.СлужебноеПоле) КАК СлужебноеПоле ИЗ (ВЫБРАТЬ Таб1.Заказ КАК Заказ, 0 КАК СлужебноеПоле ИЗ Таб1 КАК Таб1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Таб2.Заказ, 1 ИЗ Таб2 КАК Таб2) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Заказ ИМЕЮЩИЕ СУММА(ВложенныйЗапрос.СлужебноеПоле) = 0 |
|||
48
mzelensky
21.12.13
✎
12:09
|
(0) Ты получила сертификат "СПЕЦА" и задаешь ТАКИЕ ВОПРОСЫ???
|
|||
49
EvgeniuXP
21.12.13
✎
13:39
|
(48) обычная практика - корочкам никто уже не верит.
|
|||
50
МихаилМ
21.12.13
✎
13:43
|
(48)
Вы получили "красный" диплом в институте ? |
|||
51
Torquader
21.12.13
✎
19:44
|
(48) Нет, а что тебе не нравится - задан конкретный вопрос.
Если бы "СПЕЦА" не было, было бы "Как выбрать что-то оттуда, откуда не знаю, и что с этим потом делать". |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |