Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
14-35430
Wild Wizard
2002-07-17 10:30
2002.08.12
Я тоже поступил


1-35240
Алексей126734345
2002-07-31 06:35
2002.08.12
Размер межстрочного интервала в memo или Richedit.


14-35403
Forma
2002-07-14 20:21
2002.08.12
Как зарегистрировать делфююююю???


14-35444
Baz
2002-07-17 13:37
2002.08.12
Безопасность в Интернет


14-35413
Sniffer
2002-07-16 15:14
2002.08.12
Кривые Безье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский