![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите написать 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