Форум: "Базы";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
Внизфильтрация Найти похожие ветки
← →
Andy Eremin (2003-02-11 10:21) [0]Мастера!
В результате проверки в SQL-запросе типа:
WHERE [условие1] or [условие2]
все нормально фильтруется, но происходит дубляж записей, т.е. каждая вторая запись - повторная.
Как их убрать?
Код такой:
Query1.SQL.Add("SELECT Materials.Mat_Name as Name,
Models.Mod_Name as Name2, Number, Cost ");
Query1.SQL.Add("FROM Materials, Models, Main");
Query1.SQL.Add("WHERE (Materials.Mat_Number=Number) OR (Models.Mod_CodeNumber=Number) ORDER BY Number");
← →
Кило (2003-02-11 10:24) [1]Select distinct ....
← →
Соловьев (2003-02-11 10:26) [2]
> Query1.SQL.Add("FROM Materials, Models, Main");
А что такое Main?
← →
stone (2003-02-11 10:27) [3]
> "WHERE (Materials.Mat_Number=Number) OR (Models.Mod_CodeNumber=Number)
>
Number - это что? это к чему относится? к Materials, Models или Main?
← →
Andy Eremin (2003-02-11 10:48) [4]Main - основная таблица, содержащая поля Number, Cost, (статические поля Name & Name2).
Materials и Models - таблицы с полями Mat_Number, Mat_Name и Mod_Number, Mod_CodeNumber соответственно.
Таблица Main содержит в поле Number коды материалов и моделей, имена которых находятся в таблицах Materials и Models.
Необходимо сформировать таблицу Main для визуального просмотра:
1. кода материала(или модели) [Number]
2. имя материала(или модели) [Name1 и Name2]=[Name]
3. Цены материала(или модели) [Cost]
← →
Andy Eremin (2003-02-11 10:50) [5]Пардон:
Materials и Models - таблицы с полями Mat_Number, Mat_Name и Mod_CodeNumber, Mod_Name соответственно.
← →
Соловьев (2003-02-11 10:53) [6]Так и указывай:
Main.Number
← →
stone (2003-02-11 10:55) [7]SELECT mt.Mat_Name as Name,
md.Mod_Name as Name2, mn.Number, mn.Cost FROM Main mn
INNER JOIN Models md on md.Mod_CodeNumber=mn.Number
INNER JOIN Materials mt on mt.Mat_Number=mn.Number
ORDER BY Number
← →
Reindeer Moss Eater (2003-02-11 10:57) [8]WHERE
(
(Materials.Mat_Number=Number) and (Models.Mod_CodeNumber=Number)
)
OR
(
(Materials.Mat_Number=Number) and (Models.Mod_CodeNumber<>Number)
)
OR
(
(Materials.Mat_Number<>Number) and (Models.Mod_CodeNumber=Number)
)
← →
Andy Eremin (2003-02-11 11:06) [9]2 Соловьев
Разницы нет, у меня и так - и так работает
2 stone
"INNER JOIN Models md " - что означает здесь md?
Может, просто
INNER JOIN Models on Models.Mod_CodeNumber=Main.Number ???
← →
Andy Eremin (2003-02-11 11:12) [10]2 Reindeer Moss Eater
Не работает 8-(
← →
Reindeer Moss Eater (2003-02-11 11:12) [11]Что значит не работает?
← →
Andy Eremin (2003-02-11 11:14) [12]2 Reindeer Moss Eater
Также выдает дублированные записи...
← →
Соловьев (2003-02-11 11:16) [13]
SELECT DISTINCT
← →
Andy Eremin (2003-02-11 11:19) [14]2 Соловьев
SELECT DISTINCT
Простите, но я не знаю, как им пользоваться. В хелпе не нашел...
← →
Соловьев (2003-02-11 11:24) [15]
SELECT DISTINCT ...
Вместо ... твой запрос без SELECT
← →
Anatoly Podgoretsky (2003-02-11 11:34) [16]Andy Eremin © (11.02.03 11:19)
В хелпе есть и подробно, также есть в любой книге про SQL
← →
Andy Eremin (2003-02-11 11:34) [17]2 Соловьев
Никаких изменений я не обнаружил 8-((
← →
Соловьев (2003-02-11 11:37) [18]Что написал, т.е. какой запрос?
← →
Andy Eremin (2003-02-11 11:53) [19]2 Соловьев
Гы-гы. Чего просил, то и написал:
сунул distinct между SELECT и старым запросом.
Ох, аж смешно стало. Вообщем, на большее я не догадался.
← →
Соловьев (2003-02-11 12:06) [20]Покажи те записи(часть), которые ты считаешь одинаковыми.
Может для тебя они визуально одинаковы? А там на самом деле с русская, а там должна быть английская?
← →
Andy Eremin (2003-02-11 12:07) [21]Сделал так:
Сначала старый запрос, затем DISTINCT.
Все получилось, только время выборки не уменьшилось.
Дело в том, что предыдущий запрос создает записей не N*2, а N*M*K - где N и M и K - число записей таблиц Materials, Models, Main
5 минут для фильтрации - многовато
← →
Reindeer Moss Eater (2003-02-11 12:10) [22]Для декартова произведения 3 таблиц 5 минут - это не время.
:)
← →
Andy Eremin (2003-02-11 12:16) [23]Reindeer Moss Eater
Да, но с двумя таблицами (Materials, Main) программа справляется мгновенно, выдавая то, что нужно.
А Models - само по себе маленькая.
Логики нет ждать 5 минут для фильтрации
← →
stone (2003-02-11 12:17) [24]
> "INNER JOIN Models md " - что означает здесь md?
псевдоним таблицы, чтобы не писать везде ее полное имя
← →
Andy Eremin (2003-02-11 12:34) [25]2 stone
После предложенной Вами фильтрации в итоге ничего не остается, т.е. ни одной записи
Query1.SQL.Add("SELECT Materials.Mat_Name as Name, Models.Mod_Name as Name2, Number, Code, Was_Quantity, Quantity ");
Query1.SQL.Add("FROM Main INNER JOIN Materials ON Materials.Mat_Number=Number ");
Query1.SQL.Add("INNER JOIN Models ON Models.Mod_CodeNumber=Number ORDER BY Number");
← →
Соловьев (2003-02-11 12:37) [26]2 Andy Eremin ©
Отестируй свой запрос в SQL Exploere.
Я всегда там тестю, и нахожу то решение которое мне надо.
← →
chudaks (2003-02-11 12:39) [27]А если так:
select DISTINCT Materials.Mat_Name as Name,Models.Mod_Name as Name2, Number, Cost FROM Materials, Models, Main WHERE (Materials.Mat_Number=Main.Number) OR (Models.Mod_CodeNumber=Main.Number) ORDER BY Number
;-)
← →
stone (2003-02-11 13:04) [28]
> После предложенной Вами фильтрации в итоге ничего не остается,
> т.е. ни одной записи
Во-первых это ни фильтрация, а текст запроса. Давайте уж будем точными в терминологии.
Во-вторых, следует учитывать принцип логического построения данных. Возможно вместо INNER JOIN нужно использовать LEFT OUTER JOIN или RIGHT OUTER JOIN. Все зависит от конкретных условий. Проанализировать Ваши данные телепатически я не в состоянии.
В-третьих, это азы SQL. Не поленитесь и почитайте литературу.
← →
Соловьев (2003-02-11 13:18) [29]2 Andy Eremin ©
могу выслать текста.
← →
Andy Eremin (2003-02-11 14:36) [30]Спасибо, Мастера.
С Вашей помощью я добился желаемого.
Очень помог совет By Соловьев
"Отестируй свой запрос в SQL Explorer. Я всегда там тестю, и нахожу то решение которое мне надо."
Последний вопрос, который я хотел бы выяснить:
В ЗАПРОСЕ указывается имя таблиц (например: Materials).
Как указать, что они находятся под другим псевдонимом (DataBaseName)?
← →
Соловьев (2003-02-11 15:16) [31]вроде можно передавать как параметр имя алиаса.
← →
Andy Eremin (2003-02-11 15:19) [32]2 Соловьев
Это понятно, но как написать?
← →
Andy Eremin (2003-02-11 15:25) [33]2 Соловьев
Если таблица находится ниже, в подкаталоге, то:
[имя подкаталога]\[имя таблицы.db].
А если выше?
← →
Reindeer Moss Eater (2003-02-11 15:29) [34]Это понятно, но как написать?
Пуск->Программы->Borland Delphi 6-> Help->Borland Database Engine->Local SQL Guide
← →
Reindeer Moss Eater (2003-02-11 15:32) [35]Как указать, что они находятся под другим псевдонимом (DataBaseName)?
Если таблица находится ниже, в подкаталоге, то:
[имя подкаталога]\[имя таблицы.db].
А если выше?
Зачем смешивать несовместимое (Псевдонимы и имена каталогов) ???
← →
Andy Eremin (2003-02-11 15:35) [36]2 Reindeer Moss Eater
у меня такого НЕТ
← →
Reindeer Moss Eater (2003-02-11 15:36) [37]Не повезло тебе
← →
Andy Eremin (2003-02-11 15:42) [38]2 Reindeer Moss Eater
Никто не смешивает. Просто если определена структура базы (со всеми ее каталогами и подкаталогами), то грех не воспользоваться случаем. Кроме того, когда программируешь базу в первый раз, приходится очень многое писать интуитивно - авось сработает. Так? Исходников нет, город маленький, программистов тоже нет. Есть интет и "Мастера DELPHI".
А если трудно написать ответ на вопрос (и лучше в примере), не полагаясь на интуицию и опыт новичка - то лучше вообще ничего не писать.
Форум для того и создан, чтобы помогать, а не отталкивать...
← →
Reindeer Moss Eater (2003-02-11 15:52) [39]Никто не смешивает
Ну как же никто не смешивает:
- Как указать, что они находятся под другим псевдонимом
Соловьев © (11.02.03 15:16)
вроде можно передавать как параметр имя алиаса.
- Если таблица находится ниже, в подкаталоге, то:
[имя подкаталога]\[имя таблицы.db].
А если выше?
← →
Reindeer Moss Eater (2003-02-11 15:54) [40]Если у новичка нет LocalSQL.hlp, то на что полагаться отвечающим, как не на опыт и интуицию последнего?
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.014 c