Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
ВнизПомогите написать SQL-запрос Найти похожие ветки
← →
Jorchick (2002-07-23 19:10) [0]Пожалуйста.
Никак не могу сообразить :(
Есть две таблицы
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.
Пожалуйста, помогите.
← →
MsGuns (2002-07-23 19:27) [1]SELECT *
FROM "A" T1, "B" T2
WHERE (T1.dtid=T2.dtid) AND (T1.did=T2.did)
ORDER BY kid,dtid,did
← →
Jorchick (2002-07-23 20:11) [2]Не подходит.
Выдаст два значения kid (1,2).
Если я не корректно задал вопрос, то попробую по другому объяснить.
Мне нужно, выдать строку (ktid, dtid, did) в которой будут выполнены сразу два этих условия одновременно.
← →
Jorchick (2002-07-23 20:40) [3]Блин, я что-то не то написал в последний раз :)
В первом моем сообщении был более точно задан вопрос.
Я так думаю здесь нужно объединить две таблицы с помощью пересечения, но в дельфи почему то такой запрос не работает:
select kid
from a,b
where a.dtid=b.dtid
intersect
select kid
from a,b
where a.did=b.did
← →
Pingo (2002-07-23 21:38) [4]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)
← →
MsGuns (2002-07-23 22:13) [5]SELECT DISTINCT T1.kid
FROM "A" T1, "B" T2
WHERE (T1.dtid=T2.dtid) AND (T1.did=T2.did)
← →
Jorchick (2002-07-23 23:27) [6]Извините
я таблицу b не правильно написал
b (dtid, did)
1 4
4 4
Должно вывести только kid=1, потому что
1 1 4
1 4 4
(выполнились 2 условия)
В случае kid=2 выполняется только одно условие
2 4 4
Еще раз прошу прощение за неточность исходных данных.
← →
Lusha (2002-07-24 09:32) [7]А какая СУБД?
← →
Abu (2002-07-24 10:29) [8]Для 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)
← →
Jorchick (2002-07-24 12:21) [9]Lusha
Использую BDE.
Abu
Такой запрос ругается на какой-то Select (наверно в первом подзапросе).
← →
Abu (2002-07-24 12:58) [10]Честно - 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 14:16) [11]Большое спасибо всех кто помогал.
Abu
Я там и сделал... вернее почти так
сбросил в файл первый запрос, а потом воспользовался вторым.
Второй оказался проще, поскольку я и так знаю сколько там строк, так что подзапрос оказался не нужным.
А для чего нужно GROUP BY?
← →
Abu (2002-07-24 14:38) [12]GROUP BY группирует по значениям указанного поля, т.е.
в данном случае вычисляет количество строк, удовлетворяющее условию, для каждого значения kid
← →
DmitryK (2002-07-24 14:59) [13]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, на случай наличия дублирующихся условий.
← →
Jorchick (2002-07-24 17:52) [14]DmitryK
Действительно...
Спасибо за подсказку.
Но запрос с DISTINCT пришлось переделать так, чтобы работал в BDE.
Получилось
SELECT DISTINCT a.kid, a.dtid, a.did
FROM a
И это забросил все это в файл, а дальше все сделал как было предложено Abu.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c