Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Delphi+Sql+MS VFP Driver (выборка из таблиц без дублей)

25.11.2010, 17:35. Показов 2616. Ответов 11
Метки нет (Все метки)

Помогите разобраться в SQL, имеется вот такой запрос:
К примеру приведу базу (dbf файл) содержащую сведения о работниках какой-либо компании....

SELECT 'отсутствующие',F.id,reason.prim,tab.fm,tab.im,tab.ot FROM F,tab,reason WHERE tab.id=F.id AND F.id NOT IN (SELECT id FROM F2) UNION SELECT 'Появившиеся',F2.id,reason.prim,tab.fm,tab.im,tab.ot FROM F2,tab,reason WHERE tab.id=F.id AND F2.id NOT IN (SELECT id FROM F)

F и F2 - главные таблицы по которым идёт сравнение сотрудников (их номеров)
reason - таблица причин принятия на работу и увольнения (prim - поле где указывается причина)
tab - таблица id номеров сотрудников (fm,im,ot - поля ФИО)

Все таблицы имеют общее поле id

Проблема: при таком запросе в таблицу вроде как выводится то что мне нужно, но много задвоенных записей (дубли не полностью идентичные, причины разные, многих несколько раз восстанавливали и увольняли), есть в таблице reason и удалённые записи (как раз они и дублируются, от них нужно избавится), при просмотре через БД их вроде как не видно, но при просмотре через "DBF viewer" они помечены на удаление, подскажите как справится с этой проблемой, как оптимизировать запрос, или может в коде программы что-то добавить для индексации таблицы???

P.S. использую для взаимодействия драйвер Microsoft Visual Fox Pro Driver, работаю через ADO.query
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2010, 17:35
Ответы с готовыми решениями:

Delphi и SQL Выборка из связанных таблиц, по ключевым полям с разными типами (счётчик-текстовый)
Всем доброго времени суток. Разрабатываю программу по учёту сотрудников. Проделана очень большая...

SQL выборка из 2 таблиц
Добрый вечер! Для примера: Есть 2 таблицы "Марка" и "Модели" ID 1 Ауди ID 2...

SQL выборка из нескольких таблиц
Существует 2 таблицы, "result" и "sportsman", заполненные посредством "INSERT INTO". Необходимо...

Выборка из многих таблиц SQL запросом
Форумчане, очень требуется Ваша помощь! Есть аксессная БД .mdb, к которой подключается...

11
Супер-модератор
8765 / 2497 / 141
Регистрация: 07.03.2007
Сообщений: 11,848
25.11.2010, 19:59 2
>arty<, удаленные записи, которые вы видите просмоторщиком, в запросах не участвуют... дубликаты у вас из-за того, что кол-во полей в выборке большое, любое отличие в них порождает новую запись в выборке, да и distinct я в упор не вижу...
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
25.11.2010, 20:19  [ТС] 3
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
>arty<, удаленные записи, которые вы видите просмоторщиком, в запросах не участвуют... дубликаты у вас из-за того, что кол-во полей в выборке большое, любое отличие в них порождает новую запись в выборке, да и distinct я в упор не вижу...
если я убираю из запроса reason.prim - всё нормально, distinct результата в данном случае не даёт, просто по одному и тому же номеру в таблице reason значится множество операций - мне нужна лишь самая "свежая" из них.
0
Супер-модератор
8765 / 2497 / 141
Регистрация: 07.03.2007
Сообщений: 11,848
25.11.2010, 20:25 4
>arty<, а вы это поле prim получайте вложенным подзапросом, а еще неплохо бы доставить условий, чтобы обрезать ненужное
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
25.11.2010, 20:41  [ТС] 5
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
>arty<, а вы это поле prim получайте вложенным подзапросом, а еще неплохо бы доставить условий, чтобы обрезать ненужное
Ну тогда подскажите пожалуйста, укажите на мои ошибки, я ведь не прошу за меня сделать, запрос практически готовый, но выборку делает не совсем так как хотелось бы....
0
Супер-модератор
8765 / 2497 / 141
Регистрация: 07.03.2007
Сообщений: 11,848
25.11.2010, 20:53 6
>arty<, для начала - почему в запросе не отсеиваются уволенные сотрудники, разве датами этого отсечь нельзя? во-вторых, вы не знаете, что такое вложенный подзапрос? у вас в сущности просто связи указаны в запросе и более ничего...
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
25.11.2010, 21:27  [ТС] 7
нет, в таблице reason дат нет, что такое вложенный подзапрос я действительно незнаю, я новичок в SQL, вложенный подзапрос это что то вроде этого?
SQL
1
SELECT 'отсутствующие',F.id,tab.fm,tab.im,tab.ot FROM F,tab,reason WHERE tab.id=F.id (SELECT reason.prim WHERE id=F.id) AND F.id NOT IN (SELECT id FROM F2) UNION SELECT 'Появившиеся',F2.id,reason.prim,tab.fm,tab.im,tab.ot FROM F2,tab,reason WHERE tab.id=F.id (SELECT reason.prim WHERE id=F.id) AND F2.id NOT IN (SELECT id FROM F)
0
Супер-модератор
8765 / 2497 / 141
Регистрация: 07.03.2007
Сообщений: 11,848
25.11.2010, 23:52 8
ну у вас же в запросе они есть:
SQL
1
(SELECT reason.prim WHERE id=F.id)
просто в списке полей вместо имени поля укажите вложенный подзапрос, ну и конечно же надо указать по какому полю из основного запроса будет связь
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
26.11.2010, 06:31 9
>arty<, Посмотри, у тебя в качестве основных источников данных мчпользуются
FROM F,tab,reason
при этом накладывается ограничение
tab.id=F.id
а на reason никаких ограничений. Поэтому каждая запись, отбираемая из F,tab с ограничением tab.id=F.id будет включаться в результирующий набор столько раз, сколько у тебя записей в reason. Так ты написал запрос.
СОВЕТ: почитай книжку Грабера SQL. Много полезного!
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
26.11.2010, 14:50  [ТС] 10
Вот запрос, теперь всё работает!

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT 
'отсутствующие',
F.npd,
tab.fm,
tab.im,
tab.ot,
voc.name 
FROM tab 
 INNER JOIN F ON tab.id = F.id
 LEFT JOIN reason ON tab.id = reason.id
 LEFT JOIN voc ON reason.prim = voc.kod
WHERE F.id NOT IN (SELECT id FROM F2) 
UNION 
SELECT 
'Появившиеся',
F2.id,
tab.fm,
tab.im,
tab.ot,
voc.name
FROM tab
 INNER JOIN F2 ON tab.id = F2.id
 LEFT JOIN reason ON tab.id = reason.id
 LEFT JOIN voc ON reason.prim = voc.kod
WHERE F2.id NOT IN (SELECT id FROM F)
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
26.11.2010, 16:30 11
Цитата Сообщение от >arty< Посмотреть сообщение
ON reason.prim = voc.kod
Вот этого и не хватало!
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
26.11.2010, 16:50  [ТС] 12
Цитата Сообщение от SAMZ Посмотреть сообщение
Вот этого и не хватало!
нет, не в этом даже дело было, пробовал и с этой таблицей с выборкой и условием, не хватало оператора left join и inner join - объединения таблиц по условию, именно это позволило избавится от дублей и получить правильный результат
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2010, 16:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Выборка 2х таблиц LINQ без join
Здравствуйте! Недавно познакомился с LINQ запросами. Есть DataSet связанный с MSSQl БД. ...

Выборка из двух таблиц sql в одном запросе
есть 2 таблицы log_gp и log_ep в них одинаковые поля &quot;id&quot; &quot;id_klient&quot; &quot;time&quot; &quot;opis&quot; &quot;info&quot; ...

Ошибка в SQL-запросе. Выборка с двух таблиц
string strConn, strSQl; strSQl = &quot;SELECT Student.Surname, Student.Name,...

Выборка из несколько таблиц без повторного запроса
Я новачок в етом деле, не судите строго. Есть вот такой код $magazine=&quot;SELECT id, model, price,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.