Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL-запрос [D5, Paradox]


SashSt ©   (2003-05-21 08:38:00) 

Помогите разобраться с SQL-запросом.
Несмотря на кажущуюся простоту, стою
в тупике:
………………
q.SQL.Text:=
‘SELECT * from “x.db”
WHERE (Id = :Id1) AND (Id = :Id2) AND (Id = :Id3)’;

q.ParamByName(‘Id1’).AsInteger:=x;
q.ParamByName(‘Id2’).AsInteger:=y;
q.ParamByName(‘Id3’).AsInteger:=z;
q.Open;

Записи не отбираются.
Если параметр лишь один (Id = :Id1) все в порядке,
Как только их 2 и больше – пусто.

Подскажите, кто может!
Спасибо!!!


Соловьев   (2003-05-21 10:22:00) [1]


> SashSt (21.05.03 10:16)

интересно как же он работает? не ужели выдает то что ты хотел?


_designer_   (2003-05-21 10:22:00) [2]

а если честно:
http://www.delphimaster.ru/cgi-bin/forum.pl?look=1&id=1053338435&n=1
прежде чем вопрос задавать почитай форум...


_designer_   (2003-05-21 10:18:00) [3]

select id1 from ttt where id2=1 and id1 in
(select id1 from ttt where id2=2 and id1
in (select id1 from ttt where id2=3));


Для таблицы ttt (id1 int, id2 int)
выбор таких id1 при которых id2 и 1 и 2 и 3
Если нужно одно - возьми только первую запись...


SashSt   (2003-05-21 10:16:00) [4]

Огромное спасибо, Hryamzik!!
Единственный нормальный рабочий совет!!!

P.S.
Спасибо и самым "умным". Без их
умозаключений не так скучно жить.
Это к Johnmen"у...


Sandman25   (2003-05-21 10:15:00) [5]

http://www.delphimaster.ru/cgi-bin/forum.pl?look=1&id=1053338435&n=1

Там был задан аналогичный вопрос.


Hryamzik   (2003-05-21 09:59:00) [6]

SELECT DISTINCT x1.IDFirma FROM "x.db" x1
INNER JOIN "x.db" x2 ON x1.IDFirma=x2.IDFirma
INNER JOIN "x.db" x3 ON x1.IDFirma=x3.IDFirma
WHERE (x1.Id = :Id1) AND (x2.Id = :Id2) AND (x3.Id = :Id3)

или

SELECT IDFirma FROM
(SELECT IDFirma, Count(*) cnt FROM
(SELECT * FROM "x.db"
WHERE Id IN (:Id1,:Id2,:Id3)) x1
GROUP BY IDFirma) x1
WHERE cnt>=3

Если нужна ОДНА любая фирма то можно использовать SELECT TOP 1


Sergey13   (2003-05-21 09:54:00) [7]

2SashSt (21.05.03 08:38)
Ты бы не изгалялся, а привел структуру таблицы и рабочий запрос, а то гадай тут где ты наврал, где ошибся а где "сократил"


WarLord   (2003-05-21 09:39:00) [8]

SELECT * from “x.db”
WHERE Id IN (:Id1,:Id2,:Id3)


Соловьев   (2003-05-21 09:39:00) [9]


>из этой промежуточной таблицы мне нужно отобразить ОДНУ >id_фирму,которая производит лекарства по принципу (и то, и >другое, и тертье - вместе!!!).

Ты же написал

> Разные "Фирмы" могут производить одно и то же лекарство

Как тогда можно получить в результате 1 фирму?


Johnmen   (2003-05-21 09:38:00) [10]

Ну и тормоза...
Тебе же уже все разжевали, ты че ??? Danilka © (21.05.03 08:46)


Наталия   (2003-05-21 09:34:00) [11]

Тогда, наверное, есть смысл попробовать через EXISTS.


SashSt   (2003-05-21 09:24:00) [12]

Вся штука в том, что OR выберет все записи без разбора...
Если говорить подробнее - то дело обстоит так. Есть
поле("Фирма") и есть таблица лекарства с полем("Лекарство").
И есть промежуточная таблица (id_фирма, id_лекарство)
Разные "Фирмы" могут производить одно и то же лекарство.Так вот,из этой промежуточной таблицы мне нужно отобразить ОДНУ id_фирму,которая производит лекарства по принципу (и то, и другое, и тертье - вместе!!!). А OR выберет все(!!!) фирмы подряд, где найдет Id_лекарство втупую.
Описанный мною запрос лишь нужно расширить, само собой,
("WHERE IdFirma = :IdFirma AND ......... ), извините...
Спасибо!


Rol   (2003-05-21 08:47:00) [13]

Всё верно. Хочешь получить результат - используй голову и or.


Danilka   (2003-05-21 08:46:00) [14]

ты написал что-то типа: дайте мне запись у которой поле ID одновременно равно 5, 3 и 7.
Просто такой записи никогда быть не может :))
попробуй AND, заменить на OR.


Наверх

Титульная страница Поиск, карта сайта Написать письмо