![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 27.06.2009
Сообщений: 30
|
![]()
Здравствуйте, уважаемые! Есть такая задача. Необходимо средствами SQL получить из нескольких таблиц записи, которые есть в двух, в трех либо во всех.
Структура такая: ID, Tovar, Sklad. Например, есть таблички: Table1: | 1 | Ручка | Склад1 |; | 2 | Карандаш | Склад1 |; | 1 | Ластик | Склад1 | Table2: | 1 | Ручка | Склад2 |; | 1 | Карандаш | Склад2 |; | 1 | Линейка | Склад2 |; Table3: | 1 | Транспортир | Склад3 |; | 1 | Пенал | Склад3 |; | 1 | Ручка | Склад3 |. Фактически каждая таблица это один отдельный склад. Поэтому у таблиц одинаковая структура: На выходе нужно получить что-то вроде этого: Склад1 Склад2 Склад3 РУЧКА. Склад1 Склад2 КАРАНДАШ. Помогите реализовать.. Буду рад любым вариантам.. Спасибо! |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
что является уникальным идентификатором, однозначно определяющим товар?! (должен быть Артикул или ШифрТовара)..
Или Вы считаете, что наименование товара Tovar - это однозначно определяет уникальность товара?!! Тогда Вы неправы! а по сути вопроса. чтобы найти товар, который есть на всех трёх складах достаточно написать: Код:
p.s. запрос 100% рабочий. Но я при этом весьма сомневаюсь, что это запрос применим на практике... но! Какой вопрос - такой и ответ... |
![]() |
![]() |
![]() |
#3 |
C++ hater
Старожил
Регистрация: 19.07.2009
Сообщений: 3,333
|
![]()
2Serge_Bliznykov
cross join... жесть)) Код:
автору: корявая у тебя структура таблиц. как надо: 1-ая таблица: товары. описание каждого товара (наименование, вес, какие нить свойства товара) 2-ая таблица: список складов. (название, адрес и тд) 3-ая таблица: связь склада с товарами (id товара, id склада, кол-во товара) тогда показать товары, которые есть на Складе1, Складе2 и Складе3 можно так: Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 27.07.2011 в 01:43. |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Можно поподробнее, что именно не понравилось/что не будет работать? На самом деле, ни мой, ни Ваш запрос не решает ту задачу, которую хочет автор топика. (я специально выделил в своём сообщении "есть на всех трёх складах") А ему хотелось бы видеть товар, который есть на двух складах из трёх (например, на втором и третьем)... Я могу написать такой запрос... если надо... НО! 1) я полностью согласен с тем, что структура БД НЕПРАВИЛЬНАЯ. Если есть возможность - меняйте, пока не поздо!! 2) ну и неплохо бы знать целевую СУБД (могут быть нюансы.. например, можно ли использовать CASE ... ) |
|
![]() |
![]() |
![]() |
#5 | |||
C++ hater
Старожил
Регистрация: 19.07.2009
Сообщений: 3,333
|
![]()
2Serge_Bliznykov
Цитата:
Цитата:
![]() Цитата:
![]() Код:
![]()
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 27.07.2011 в 11:04. |
|||
![]() |
![]() |
![]() |
#6 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Нормальная связь между тремя таблицами. И работать будет отнюдь НЕ МЕДЛЕННО. (я только что проверил на таблицах с 10 тысячами записей, в выборке примерно полмиллиона записей(почем так много - отдельный вопрос). Oracle. первая выборка 0.175 секунды, вторая выборка этим же запросом (оракл закешировал) - 0.09 секунды) Разумеется, связь по текстовому полю и, разумеется, никаких индексов нет. Вашим запросом - первая выборка 0.12 секунды, после кеширования - 0.06 секунды) проблема в том, что ваш вариант запроса с EXIST - это СОВСЕМ другой запрос! Ну, например, Вы таким образом не получите количество товара на втором и третьем складах... Цитата:
Ладно. я понял Вашу позицию... думаю, диспут продолжать бессмысленно... Последний раз редактировалось Serge_Bliznykov; 27.07.2011 в 11:45. |
||
![]() |
![]() |
![]() |
#7 | |||||
C++ hater
Старожил
Регистрация: 19.07.2009
Сообщений: 3,333
|
![]()
2Serge_Bliznykov
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
|||||
![]() |
![]() |
![]() |
#8 | |||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Цитата:
Данный запрос НЕ ЯВЛЯЕТСЯ CROSS JOIN это INNER JOIN, если уж терминология с JOIN Вам ближе! Декартово произведение даст нам количество записей равное перемножению числу записей всех таблиц, участвующих в запросе, если для них НЕ УКАЗАНО поле связи. например, т.е. если в таблице 1 - 2 записи в таблице 2 - 5 записей и в таблице 3 - 4 записи то в результате запроса: Код:
в результате же запроса Код:
Если одинаковый товар будет ОДИН, то в результаете будет ОДНА запись в результирующем запросе. ИЛИ НИ ОДНОГО, если товары в разных таблицах все будут отличаться. Где Вы здесь увидели декартово произведение?!! Но, разумеется, поле TOVAR должно быть ИДЕНТИФИЦИРУЮЩИМ (т.е. уникальным в пределах одной таблицы). очень странно, что мне Вам приходится рассказывать азбучные истины... я же вижу Ваш уровень... Цитата:
Пусть Автор разберается, что ему нужно и что он хочет получить |
|||
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 27.06.2009
Сообщений: 30
|
![]()
Огромное спасибо господа, pproger и Serge_Bliznykov!!! В вашей дискуссии я увидел очень полезные для своей задачи и для себя в частности мысли и способы реализации..
Таблицы и правда кривые, но использовать нужно именно так без ключевого поля, а если даже оно и есть то в пределах одной таблицы.. А также внутри одной таблицы тоже могут быть двойники с разными ID.. Поэтому с целью полного исключения дублирующихся записей могу полагаться только на "Наименование".. P.S. Ещё раз благодарю, очень приятно получить помощь и "услышать" мнение таких замечательных специалистов! А также, отдельное спасибо, создателям этого полезного и удобного форума! ![]() Проблему с поиском двойников решил) Теперь ситуация обстоит так: Sklad | Tovar Склад_1 | Карандаш Склад_2 | Карандаш ------------------ Склад_3 | Ластик Склад_1 | Ластик ------------------ Склад_1 | Линейка Склад_2 | Линейка ------------------ ........................ Склад_n | Ручка Склад_m | Ручка Складов n-ое количество... Задача посчитать сколько общих двойников у каждой пары складов... И (или) вывести их в таком виде: Склад_n Склад_m - общее количество двойников Пример: Склад_1 Склад_2 - 2 Благодарю за любую помощь или совет... Последний раз редактировалось Stilet; 29.07.2011 в 07:39. |
![]() |
![]() |
![]() |
#10 |
Proffesional
Форумчанин
Регистрация: 18.11.2008
Сообщений: 417
|
![]()
не совсем понял, что значит поиск двойников. Может тебе стоит прочитать про group by?
О, степь родимая, как я скучаю по тебе...
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск совпадений | Claster | Общие вопросы Delphi | 4 | 22.06.2011 17:34 |
Поиск совпадений в ListBox | NiKiToZZ- | Помощь студентам | 7 | 05.01.2011 10:54 |
Поиск совпадений в БД | _PROGRAMM_ | PHP | 6 | 21.05.2010 13:53 |
Поиск данных в нескольких таблицах | a_n_n_a | БД в Delphi | 10 | 23.04.2010 11:33 |
Поиск совпадений | mistx | Microsoft Office Excel | 22 | 14.08.2009 13:41 |