Вопрос № 76963: Уважаемые эксперты...
Вопрос следующего свойства, допустим есть таблица
users - Описания людей с полями
user_index - ключ
name
c_index.
И есть таблица cars - Машины с полями
car_index - ключ
discript
Поле с_...Вопрос № 76989: 1) Какие есть методы и направления JOIN-а и чем они отличаются ? Желательно в кратце с примерами :)
2) подскажите ссылку на хорошую документацию по PostgreSQL. (кроме официального сайта, и желательно на русском)
.Вопрос № 77225: Подскажите пожалуйста какую СУБД выбрать для того чтобы просто хранить тысяч 50-100 записей, каждая из которых будет содержать скан в виде bmp-файла. Планируется прогонять анализируемое изображение через все образцы для сверки и нахождения совпадения...Вопрос № 77287: Здравствуйте. Помогите пожалуйста составить запрос в Aссess 2003 . Как составить запрос на выборку записей по последним пяти цифрам. Например,
есть номера телефонов с кодом, пример 5544332211, есть номера без кода но с префиксом, например 3-32211, и ...
Вопрос № 76.963
Уважаемые эксперты...
Вопрос следующего свойства, допустим есть таблица
users - Описания людей с полями
user_index - ключ
name
c_index.
И есть таблица cars - Машины с полями
car_index - ключ
discript
Поле с_index обьеденено с car_index. При этом значение в поле c_index не обязательно.
Задача, выбрать людей и описания их машин, но если поле c_index пустое, то эта запись почему-то не выводится. Как с этим боротся...
Отвечает: Jadd
Здравствуйте, Пашков А.М.!
Потому, что метод объединения таблиц выбран INNER JOIN, что предполагает точное соответсвие условию. Если нужно неточное, т.е. допускающее нулевые (или пустые) значения, нужно использовать LEFT (RIGHT, FULL) OUTER JOIN. В данной ситуации это будет LEFT OUTER JOIN и код запроса должен быть таким:
SELECT users.name, cars.discript
FROM cars LEFT OUTER JOIN users ON cars.car_index = users.c_index;
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал) Адрес: Санкт-Петербург WWW:http://www.sport-diary.ru ---- Ответ отправлен: 27.02.2007, 13:43 Оценка за ответ: 5 Комментарий оценки: Спасибо огромное... помогло :-) Пошел читать читать про OUTER JOIN.
Отвечает: Карпов Алексей
Здравствуйте, Пашков А.М.!
Вы у себя в запросе указали жосткую привязку "INNER" вместо его используйте "OUTER".
Ответ отправил: Карпов Алексей (статус: 8-ой класс)
Ответ отправлен: 27.02.2007, 13:44 Оценка за ответ: 5 Комментарий оценки: Быстрый и точный ответ. Ничего лишнего, и все правильно :-)
Отвечает: Архангельский Андрей Германович
Здравствуйте, Пашков А.М.!
1) Нельзя вывести поле cars.discript если на эту запись никто не ссылается (поле c_index пустое)
Корректно будет ввести запись где cars.descript имеет значение "N/A" (нет данных)
и связать ее с теми полями где c_index пустое, тогда поле c_index не будет пустым и все будет выводится.
Но на самом деле таблицы построена некорректно - один человек может имет несколько машин, одной машиной могут пользоваться несколько человек (по доверенности)
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 27.02.2007, 13:55 Оценка за ответ: 3 Комментарий оценки: Это был только пример проблемы, реальная база данных огромна, сложна и совершенно на другую тему. Ответ дает только ненужную избыточность недопустимую в базах данных.
Отвечает: Grigory
Здравствуйте, Пашков А.М.!
Используйте OUTER JOIN и тогда все должно получиться.
Удачи!
Ниже привожу примеры из документации SQL Server 2000:
Using Left Outer Joins
Consider a join of the authors table and the publishers table on their city columns. The results show only the authors who live in cities in which a publisher is located (in this case, Abraham Bennet and Cheryl Carson).
To include all authors in the results, regardless of whether a publisher is located in the same city, use an SQL-92 left outer join. The following is the query and results of the Transact-SQL left outer join:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
The LEFT OUTER JOIN includes all rows in the authors table in the results, whether or not there is a match on the city column in the publishers table. Notice that in the results there is no matching data for most of the authors listed; therefore, these rows contain null values in the pub_name column.
Using Right Outer Joins
Consider a join of the authors table and the publishers table on their city columns. The results show only the authors who live in cities where a publisher is located (in this case, Abraham Bennet and Cheryl Carson). The SQL-92 right outer join operator, RIGHT OUTER JOIN, indicates all rows in the second table are to be included in the results, regardless of whether there is matching data in the first table.
To include all publishers in the results, regardless of whether a city has a publisher located in the same city, use an SQL-92 right outer join. Here is the Transact-SQL query and results of the right outer join:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a RIGHT OUTER JOIN publishers AS p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
An outer join can be further restricted by using a predicate (such as comparing the join to a constant). This example contains the same right outer join, but eliminates all titles that have sold fewer than 50 copies:
USE pubs
SELECT s.stor_id, s.qty, t.title
FROM sales s RIGHT OUTER JOIN titles t
ON s.title_id = t.title_id
AND s.qty > 50
ORDER BY s.stor_id ASC
Using Full Outer Joins
To retain the nonmatching information by including nonmatching rows in the results of a join, use a full outer join. Microsoft® SQL Server™ 2000 provides the full outer join operator, FULL OUTER JOIN, which includes all rows from both tables, regardless of whether or not the other table has a matching value.
Consider a join of the authors table and the publishers table on their city columns. The results show only the authors who live in cities in which a publisher is located (in this case, Abraham Bennet and Cheryl Carson). The SQL-92 FULL OUTER JOIN operator indicates that all rows from both tables are to be included in the results, regardless of whether there is matching data in the tables.
To include all publishers and all authors in the results, regardless of whether a city has a publisher located in the same city, or whether a publisher is located in the same city, use a full outer join. The following is the query and results of the Transact-SQL full outer join:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a FULL OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
--------- Если хочешь быть счастливым - будь им! (Козьма Прутков)
Ответ отправил: Grigory (статус: Студент)
Ответ отправлен: 27.02.2007, 17:35 Оценка за ответ: 5 Комментарий оценки: Очень развернуто, даже немного слишком, хотя хочу заметить что не все знают английский...
Отвечает: Vvvv
Здравствуйте, Пашков А.М.!
ну начнем издалека объединение таблиц в запросе выполняется командой JOIN, которая имеет следующие параметры: INNER - в результат запроса попадают записи из обоих таблиц, которые удовлетворяют условию объединения, LEFT - в результат запроса попадают все записи из левой таблицы и только те записи из правой таблицы, которые удовлетворяют условию объединения, RIGHT - обратное Left`у, условие объединения - это условие объединения, обычно в условии значится что значения из ключевого поля одной таблицы равно значениям
из ключевого поля другой таблицы, хотя условие может содержать понесколько полей для каждой таблицы например Т1.Дата = Т2.Дата AND Т1.ВРемя = Т2.ВРемя, конечно пример неудачен но суть таже
Да еще: левая таблица считается та, которая ближе к FROM ну а правая которая дальше
Ну теперь к вопросу, в вашем примере все же необходимо использовать LEFT JOIN или LEFT OUTER JOIN
Ответ отправил: Vvvv (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 13:31 Оценка за ответ: 5 Комментарий оценки: Спасибо, все верно.... я уже давно решил эту проблему исходя из предыдущих ответов.
Вопрос № 76.989
1) Какие есть методы и направления JOIN-а и чем они отличаются ? Желательно в кратце с примерами :)
2) подскажите ссылку на хорошую документацию по PostgreSQL. (кроме официального сайта, и желательно на русском)
Отвечает: Vvvv
Здравствуйте, Илья Андреевич!
объединение таблиц в запросе выполняется командой JOIN, которая имеет следующие параметры: INNER - в результат запроса попадают записи из обоих таблиц, которые удовлетворяют условию объединения, LEFT - в результат запроса попадают все записи из левой таблицы и только те записи из правой таблицы, которые удовлетворяют условию объединения, RIGHT - обратное Left`у, условие объединения - это условие объединения, обычно в условии значится что значения из ключевого поля одной таблицы равно значениям из ключевого поля
другой таблицы, хотя условие может содержать понесколько полей для каждой таблицы например Т1.Дата = Т2.Дата AND Т1.ВРемя = Т2.ВРемя, конечно пример неудачен но суть таже
Да еще: левая таблица считается та, которая ближе к FROM ну а правая которая дальше
Ответ отправил: Vvvv (статус: 2-ой класс)
Ответ отправлен: 28.02.2007, 13:32
Вопрос № 77.225
Подскажите пожалуйста какую СУБД выбрать для того чтобы просто хранить тысяч 50-100 записей, каждая из которых будет содержать скан в виде bmp-файла. Планируется прогонять анализируемое изображение через все образцы для сверки и нахождения совпадения. Система будет однопользовательская. Заранее спасибо.
Отправлен: 28.02.2007, 22:05
Вопрос задал: Greenie (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: din
Здравствуйте, Greenie!
Если нет желания нагружать компьютер и хотите сделать простой установщик, то это Paradox 7. Это не СУБД, а просто БД. И если Вы пишете на Делфи лучшего выбора нет. А что касается СУБД, то можно любую, тот же MySQL или FireBird.
Удачи!
--------- Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Практикант)
Ответ отправлен: 28.02.2007, 22:51
Отвечает: Grigory
Здравствуйте, Greenie!
Если система однопользовательская, то вполне подойдет Access - он работает довольно быстро с объемами до миллиона записей. Если же хотите что-нибудь более мощное/быстрое, то тут выбор довольно большой - SQL Server, Oracle, Sybase...
--------- Если хочешь быть счастливым - будь им! (Козьма Прутков)
Ответ отправил: Grigory (статус: Студент)
Ответ отправлен: 01.03.2007, 06:10
Отвечает: LanK
Здравствуйте, Greenie!
Хмм. Посчитаем... пусть наша картинка будет "всего" 100кб.
(Потому что bmp весьма требователен к размеру).
50 000 * 100кб = 5Гб.
Т.е. размер базы данных будет 5 ГБ! Боюсь что ни Paradox ни MSAccess с таким объемом не справятся. Есть у меня и сомнения, что с этим справятся и "монстры" типа MSSQL/Oracle.
Я бы создал структуру каталогов, а в базе данных сохранял бы только ссылку на файл. (если к каждому bmp требуется описание).
--------- Пусть все будет хорошо! Давайте жить дружно! :) И будет жить еще лучше!
Ответ отправил: LanK (статус: Студент)
Ответ отправлен: 01.03.2007, 10:52
Отвечает: Хватов Сергей
Здравствуйте, Greenie!
Сто тысяч? должна уметь любая.
У нас в базе данных порядка 100000000 (сто миллионов) записей. Это oracle под linux. Ну да - сложные запросы работают медленно. Но работают.
Ну если записей около 10000000 (десять миллионов) - попробуйте postgres
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 01.03.2007, 16:07
Вопрос № 77.287
Здравствуйте. Помогите пожалуйста составить запрос в Aссess 2003 . Как составить запрос на выборку записей по последним пяти цифрам. Например, есть номера телефонов с кодом, пример 5544332211, есть номера без кода но с префиксом, например 3-32211, и есть просто пятизначные номера 32211. Как из трех таблиц сделать запрос только по последним пяти цифрам. Спасибо.
Отправлен: 01.03.2007, 11:27
Вопрос задал: Curier (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Tek
Здравствуйте, Curier!
Запрос к каждой таблице будет выглядеть так:
SELECT * from table1 where RIGHT(PHONE_NUMBER,5)='54321'
Потом запросы ко всем таблицам объединяем UNION
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: Студент)
Ответ отправлен: 01.03.2007, 11:46
Отвечает: Кот Матроскин
Здравствуйте, Curier!
я бы использовал запрос
select * from table1, table2, table3 where phone_number like '%54321'
Ответ отправил: Кот Матроскин (статус: 3-ий класс)
Ответ отправлен: 01.03.2007, 11:59
Отвечает: Grigory
Здравствуйте, Curier!
Для выборки пяти последних символов используется функция RIGHT
Запрос будет выглядеть примерно вот так:
SELECT RIGHT([PhoneNumber],5) FROM ИМЯ ВАШЕЙ ТАБЛИЦЫ
Удачи!
Григорий
--------- Если хочешь быть счастливым - будь им! (Козьма Прутков)
Ответ отправил: Grigory (статус: Студент)
Ответ отправлен: 01.03.2007, 17:34