Главная страница
    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.005 c
3-35212
chsv
2002-07-23 20:34
2002.08.12
как подружить d5 с sql server 2000 без БДЕ?


3-35215
svmagnum
2002-07-23 20:35
2002.08.12
Kak mne sdelat progu shtob ona rabotala s udallennoj Access db


1-35254
Freeze
2002-07-31 08:36
2002.08.12
Как программно отобразить рабочий стол как Web страницу


3-35138
BJValentine
2002-07-20 18:58
2002.08.12
Параметры в ADO


14-35434
lak_b
2002-07-17 13:42
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский