Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-87260
vanek8
2003-02-11 08:55
2003.02.27
По базам данных


14-87629
Dima2002
2003-02-10 13:41
2003.02.27
RxLib для Delphi 7


9-87237
Ich Hasse
2002-09-21 13:30
2003.02.27
Как быстрее


3-87347
VLL
2003-02-11 11:02
2003.02.27
Data Link


14-87692
Dark Elf
2003-02-11 17:16
2003.02.27
Расширенный алгоритм Эвклида





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский