|
Сравнение двух таблиц в запросе | ☑ | ||
---|---|---|---|---|
0
r1000
30.11.14
✎
17:44
|
Есть две одинаковые по колонкам таблицы (номенклатуру, количество - т.е. в таблицах всего две колонки).
Задача сравнить исходные таблицы и получить таблицу с отличающимся количеством номенклатуры. т.е. буквально необходимо понять, что в 1ой таблице номенклатуры Х больше на 2шт, номенклатуры Х1 меньше на 1 шт и т.д. Перебором то у меня получается, но хочется сделать это запросом, т.к. таблицы могут быть до 150 строк в каждой - наверное запросом быстрей ? Спасибо. |
|||
1
vicof
30.11.14
✎
17:47
|
ВЫБРАТЬ * ИЗ &ВТ1 ПОЛНОЕ СОДЕНИНЕНИЕ &ВТ2
|
|||
2
r1000
30.11.14
✎
17:49
|
Т.е. сначала получить совпадающие строки, удалить их из исходных таблиц и дальше уже перебором по 2м таблицам бегать ?
|
|||
3
r1000
30.11.14
✎
18:02
|
Спасибо. (перепутал с внутренним сначала)
|
|||
4
vicof
30.11.14
✎
18:13
|
Соединяешь по номенклатуре и неравному количеству
|
|||
5
r1000
30.11.14
✎
19:15
|
Выяснился нюанс. В одной из исходных таблиц может вообще не быть какой то номенклатуры. Поэтому, результат запроса все равно обрабатывать перебором нужно...
|
|||
6
braslavets
30.11.14
✎
19:20
|
ВЫБРАТЬ СУмма(Количество),
Номенклатура (ВЫБРАТЬ -Количество, Номенклатура Из &Первая Объедини -Количество, Номенклатура Из &Вторая) Подзапрос Сгруппировать ПО Номенклатура ИМЕЮЩИЕ СУмма(Количество) <> 0 |
|||
7
ILM
гуру
30.11.14
✎
19:23
|
(6) Самое оптимальное, если минус количество, то номенклатура есть в первой таблице, а если плюс, то во второй.
|
|||
8
Sorm
30.11.14
✎
20:03
|
(6) Зачем с группировкой? Сервак грузить... Можно просто из полного соединения:
Идея: Выбрать Выбор когда Ном1 есть null тогда Ном2 иначе Ном1 конец, естьNull(Кол1,0)-естьNull(Кол1,0) из 1 полное соединение 2 по Номенклатура где естьNull(Кол1,0) <> естьNull(Кол2,0) |
|||
9
RomanYS
30.11.14
✎
20:09
|
(8) не знаю, что там в SQL
Но чаще делаю как (6): проще и нагляднее, точно нигде не вылезет NULL )) |
|||
10
r1000
30.11.14
✎
20:14
|
(6)В результат попадает и та номенклатура, по которой полное совпадение. Строки, по которым все хорошо мне не нужны.
|
|||
11
spero
30.11.14
✎
20:17
|
(10) Сначала полное соединение, потом условие.
|
|||
12
Sorm
30.11.14
✎
20:21
|
(6) Тогда первый или второй минус в подзапросе убери, чтобы человек получил только отличия...
|
|||
13
r1000
30.11.14
✎
20:22
|
(1)Спасибо.
(8)Спасибо за условие. У меня получилось вот так. Может и не оптимально, но остаются только строки по которым нет соответствия между таблицами. ЗапросСравнение.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ТекущаяТаблицаНоменклатуры.Номенклатура КАК Номенклатура, | ТекущаяТаблицаНоменклатуры.Количество КАК Количество |ПОМЕСТИТЬ ВТ1 |ИЗ | &ТекущаяТаблицаНоменклатуры КАК ТекущаяТаблицаНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ1.Номенклатура, | ВТ1.Количество, | ПоследняяТаблицаРазмещения.Номенклатура КАК ПоследняяНоменклатура, | ПоследняяТаблицаРазмещения.Количество КАК ПоследняяКоличество |ПОМЕСТИТЬ РезультатСоединения |ИЗ | ВТ1 КАК ВТ1 | ПОЛНОЕ СОЕДИНЕНИЕ ПоследняяТаблицаРазмещения КАК ПоследняяТаблицаРазмещения | ПО ВТ1.Номенклатура = ПоследняяТаблицаРазмещения.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | РезультатСоединения.Номенклатура, | РезультатСоединения.Количество, | РезультатСоединения.ПоследняяНоменклатура, | РезультатСоединения.ПоследняяКоличество |ИЗ | РезультатСоединения КАК РезультатСоединения |ГДЕ | ЕСТЬNULL(РезультатСоединения.Количество, 0) <> ЕСТЬNULL(РезультатСоединения.ПоследняяКоличество, 0)"; |
|||
14
r1000
30.11.14
✎
20:24
|
(6)Попробовал, но врубиться не получилось(((
|
|||
15
Sorm
30.11.14
✎
20:26
|
(13) Все верно, но можно и без таблицы "Результат соединения" + у тебя будет "шахматка" по номенклатуре из двух таблиц, по которым не прошло соединения. Поскольку нужно брать либо из первой таблицы, либо из второй - лучше написать "Выбор" по номенклатуре 1 или 2 таблицы.
|
|||
16
RomanYS
30.11.14
✎
20:29
|
(15) тогда уж не "выбор" , а ЕСТЬNULL(Т1.Номенклатура,Т2.Номенклатура)
|
|||
17
Sorm
30.11.14
✎
20:31
|
(14) Там нужно 1 минус убрать в подзапросе. А вообще рекомендую http://sql-ex.ru/
(15) Да. Но я хотел показать идею, а то вон человек путается, а такая конструкция с ходу менее понятна. |
|||
18
RomanYS
30.11.14
✎
20:32
|
(8) + если номенклатура может повторяться внутри одной таблицы - получишь "кашу" из дублей
(6) более универсально |
|||
19
Sorm
30.11.14
✎
20:33
|
(18) Больше грузит сервер:)
|
|||
20
RomanYS
30.11.14
✎
20:35
|
(19) если дубли могут быть, то всё равно придется группировать, только предварительно.
Ладно мы друг друга поняли ) |
|||
21
r1000
30.11.14
✎
20:39
|
(20)дублей быть не может.
(15)да. получается шахматка. а мне и нужны номенклатуры по которым нет соединения или не равно по количеству. дальше я эту табличку уже обработаю как мне нужно перебором. |
|||
22
2mugik
01.12.14
✎
06:17
|
(8)Ты хочешь сказать(грубо) что полное соединение это N квадрат, а объединение + группировка в данном случае это (2N) квадрат?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |