Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите написать SQL-запрос [D5]


Jorchick ©   (2002-07-23 19:10:00) 

Пожалуйста.
Никак не могу сообразить :(
Есть две таблицы

a (kid, dtid, did)
1 1 4
1 2 4
1 5 1
1 3 2
1 4 4
2 1 3
2 2 1
2 3 1
2 4 4

b (dtid, did)
4 1
4 4

Нужно написать запрос, который выдал бы все kid, чтобы выполнились все условия a.dtid=b.dtid and a.did=b.did
т.е. в данном случае должен вывестись только kid=1.

Пожалуйста, помогите.


Jorchick   (2002-07-24 17:52:00) [1]

DmitryK
Действительно...
Спасибо за подсказку.
Но запрос с DISTINCT пришлось переделать так, чтобы работал в BDE.
Получилось
SELECT DISTINCT a.kid, a.dtid, a.did
FROM a
И это забросил все это в файл, а дальше все сделал как было предложено Abu.


DmitryK   (2002-07-24 14:59:00) [2]

Abu написал почти правильный запрос, но в нем все-таки есть ошибка. Например, в таблицу aдобавим такую строку (2,4,4)и в результате предложенного запроса мы получим уже два значения 1и 2.

Разобъем задачу на два этапа:
1) выделить из таблицы ате записи, которые удовлетворяют условиям из таблицы b
2) определить для каких значений kidиз таблицы авыполняется весь набор условий из таблицы b

первая задача решается элементарно:

SELECT DISTINCT a.kid, a.dtid, a.did FROM a INNER JOIN b on a.dtid=b.dtid and a.did=b.did


обращаю внимание на слово DISTINCT, с помощью его отбрасываем дублирующиеся наборы из таблицы a.

Вторую же задачу, решаем точно также, как предложил Abu:

SELECT x.kid FROM
(SELECT DISTINCT a.kid, a.dtid, a.did FROM a INNER JOIN b on a.dtid=b.dtid and a.did=b.did) x
GROUP BY x.kid
HAVING COUNT(*)=(SELECT COUNT(DISTINCT *) FROM b)

единственное, что я добавил, так опят же DISTINCTпри определении количества записей в таблице b, на случай наличия дублирующихся условий.


Abu   (2002-07-24 14:38:00) [3]

GROUP BY группирует по значениям указанного поля, т.е.
в данном случае вычисляет количество строк, удовлетворяющее условию, для каждого значения kid


Jorchick   (2002-07-24 14:16:00) [4]

Большое спасибо всех кто помогал.
Abu
Я там и сделал... вернее почти так
сбросил в файл первый запрос, а потом воспользовался вторым.
Второй оказался проще, поскольку я и так знаю сколько там строк, так что подзапрос оказался не нужным.
А для чего нужно GROUP BY?


Abu   (2002-07-24 12:58:00) [5]

Честно - BDE не знаю.
Но если такие конструкции как в MS SQL не проходят, можно попробовать "в обход".
Создать VIEW для

select kid,count(*) KID1 from a,b where a.dtid=b.dtid and a.did=b.did
group by a.kid

скажем с именем Т1

а потом выполнять запрос

select T1.kid from T1 where T1.KID1=(SELECT count(*) from b)


Jorchick   (2002-07-24 12:21:00) [6]

Lusha
Использую BDE.

Abu
Такой запрос ругается на какой-то Select (наверно в первом подзапросе).


Abu   (2002-07-24 10:29:00) [7]

Для SQL Server:

select T1.kid from (select kid,count(*) KID1 from a,b where a.dtid=b.dtid and a.did=b.did
group by a.kid) T1 where T1.KID1=(SELECT count(*) from b)


Lusha   (2002-07-24 09:32:00) [8]

А какая СУБД?


Jorchick   (2002-07-23 23:27:00) [9]

Извините
я таблицу b не правильно написал
b (dtid, did)
1 4
4 4

Должно вывести только kid=1, потому что

1 1 4
1 4 4
(выполнились 2 условия)
В случае kid=2 выполняется только одно условие
2 4 4
Еще раз прошу прощение за неточность исходных данных.


MsGuns   (2002-07-23 22:13:00) [10]

SELECT DISTINCT T1.kid
FROM "A" T1, "B" T2
WHERE (T1.dtid=T2.dtid) AND (T1.did=T2.did)



Pingo   (2002-07-23 21:38:00) [11]

a (kid, dtid, did)
1 1 4
1 2 4
1 5 1
1 3 2
1 4 4
2 1 3
2 2 1
2 3 1
2 4 4

b (dtid, did)
4 1
4 4

Запрос не может выдать (1)


Jorchick   (2002-07-23 20:40:00) [12]

Блин, я что-то не то написал в последний раз :)
В первом моем сообщении был более точно задан вопрос.
Я так думаю здесь нужно объединить две таблицы с помощью пересечения, но в дельфи почему то такой запрос не работает:
select kid
from a,b
where a.dtid=b.dtid
intersect
select kid
from a,b
where a.did=b.did


Jorchick   (2002-07-23 20:11:00) [13]

Не подходит.
Выдаст два значения kid (1,2).
Если я не корректно задал вопрос, то попробую по другому объяснить.
Мне нужно, выдать строку (ktid, dtid, did) в которой будут выполнены сразу два этих условия одновременно.


MsGuns   (2002-07-23 19:27:00) [14]

SELECT *
FROM "A" T1, "B" T2
WHERE (T1.dtid=T2.dtid) AND (T1.did=T2.did)
ORDER BY kid,dtid,did


Наверх

Титульная страница Поиск, карта сайта Написать письмо