Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.27;
Скачать: CL | DM;

Вниз

фильтрация   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.016 c
1-87374
MiXenWorK
2003-02-17 16:57
2003.02.27
Печать изображений


1-87492
Sinplecy
2003-02-15 00:08
2003.02.27
цвет TMainMenu


3-87242
Andriano
2003-02-07 14:13
2003.02.27
Очень удаленные клиенты


3-87263
KonuhovSegey
2003-02-04 18:19
2003.02.27
Запрос на Update для TIBDataSet


6-87595
gari
2003-01-10 12:15
2003.02.27
Доброго дня господа.