Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: CL | DM;

Вниз

Помогите написать 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
14-35427
Демон
2002-07-17 09:23
2002.08.12
Как в RichEdit сделать разрыв страницы


1-35274
Evgeniy_MF
2002-07-31 15:27
2002.08.12
Помогите вытащить путь..


14-35435
Igor_thief
2002-07-15 13:58
2002.08.12
Музыка!


1-35323
BPK
2002-07-30 03:33
2002.08.12
Как хранить иконки в коде? (*.pas)


3-35155
awaken
2002-07-22 08:40
2002.08.12
MIDAS Server не запускается удаленно