Главная страница
    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, то на что полагаться отвечающим, как не на опыт и интуицию последнего?


 
Соловьев   (2003-02-11 16:06) [41]


> Соловьев © (11.02.03 15:16)
> вроде можно передавать как параметр имя алиаса.

Можно, только я вот не помню где я видел, там был пример как с нескольких алиасов - Оракл и Interbase.


 
Reindeer Moss Eater   (2003-02-11 16:08) [42]

Кусочек LicalSQL.hlp

Heterogeneous joins

Joins two tables from different databases.

SELECT column_list

FROM ":database_reference:table_reference", ":database_reference:table_reference" [,":database_reference:table_reference"...]

WHERE predicate [AND predicate...]

Description

Use a heterogeneous join to join two tables that reside in different databases. The joined tables may be of different types (like dBASE to Paradox or Paradox to InterBase), but you can only join tables whose database types are accessible through the BDE (local, ODBC, or SQL Links). A hetergeneous join may be any of the joins supported by local SQL. The difference is in the syntax for the table reference: the database containing each table is specified in the table reference, surrounded by colons and the whole reference enclosed in quotation marks. The database specified as part of the table reference may be a drive and directory reference (for local tables) or a BDE alias.

SELECT *

FROM ":DBDEMOS:Customer.db" C, ":BCDEMOS:Orders.db" O

WHERE (C.CustNo = O.CustNo)


 
Соловьев   (2003-02-11 16:10) [43]

2 Reindeer Moss Eater
Ну так видешь? Можно?


 
Reindeer Moss Eater   (2003-02-11 16:12) [44]

Что можно?


 
Соловьев   (2003-02-11 16:14) [45]

из разных алиасов?


 
Reindeer Moss Eater   (2003-02-11 16:15) [46]

А я утверждал что нельзя?


 
Соловьев   (2003-02-11 16:18) [47]

это у же полемика, задача решена? Я думаю что да.
А то разговоры эти уже удел чатов или аськи...


 
Reindeer Moss Eater   (2003-02-11 16:20) [48]

Andy Eremin спросил:
Как указать, что они находятся под другим псевдонимом (DataBaseName)?

Делаем вывод, что для доступа используется псевдоним (алиас)

Далее, после ответа на этот вопрос следует уточнение от Andy Eremin:
Если таблица находится ниже, в подкаталоге, то:
[имя подкаталога]\[имя таблицы.db].
А если выше?

Делаем вывод, что налицо попытка указать относительный путь к каталогу таблицы относительно имени псевдонима.

После чего идет мой вопрос:

Зачем смешивать несовместимое (Псевдонимы и имена каталогов) ???



 
Anatoly Podgoretsky   (2003-02-11 16:23) [49]

Andy Eremin © (11.02.03 15:35)
Раз уж ты занялся программированием баз, то переинсталлируй Дельфи и на этот раз не глупи поставиь все хелпы полностью



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.12 c
14-87644
Supreme
2003-02-10 20:01
2003.02.27
??


1-87425
yaJohn
2003-02-15 15:26
2003.02.27
стандартный способ получить OleVariant в виде бинарных данных


1-87395
multik
2003-02-18 01:19
2003.02.27
Как изменить шрифт в richedit.


4-87747
pirat
2003-01-13 17:08
2003.02.27
Что послать чтобы развернуть/свернуть окно?


6-87589
SeF
2003-01-08 23:51
2003.02.27
TServerSocket





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский