Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

dtuyghfdt

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
isem

А как реализовывается в этом запросе слово ВСЕ?мне препод сказал что этот запрос надо как то через реаляционную алгебру делать,типа здесь есть квантор всеобщности....

Всего записей: 32 | Зарегистр. 08-10-2008 | Отправлено: 19:26 16-12-2010
isem



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Квантор всеобщности - это общие поля в таблицах, по которым идет join
поскольку везде используется inner join (прямое соединение таблиц), то в результат попадут только те записи, которые имеют общие поля в разных таблицах. Если хотя бы одно поле не совпадает, то такая запись в результат не выведется.
 
Советую также почитать реляционную алгебру перед визитом к преподу. мож там че умного написано )

Всего записей: 81 | Зарегистр. 22-07-2005 | Отправлено: 01:22 17-12-2010
DaImeR

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток. Не могли бы помочь с простым запросом
Связка Delphi+MS Access
Имеется форма поиска по наименованиям организаций, после которой выполняется код

Код:
 
begin
form1.DBGridMain.Visible:=True;
form1.DBGridZaezd.Visible:=False;
if findwindow.ShowModal=mrOK then begin
datamodule2.ADOQueryFind.Active:=False;
DataModule2.ADOQueryFind.Parameters.ParamByName('firmname').Value:=findwindow.FindEdit.Text;
datamodule2.ADOQueryFind.Active:=True;
searchform.ShowModal; end;
end;
 

ADOQueryFind в свойстве SQL имеет запрос  

Код:
 
SELECT *
FROM main  
WHERE nameorg LIKE ":firmname"
ORDER BY nameorg;
 

который ищет вхождения firmname в поле nameorg
 
Но в результате выполнения запроса вхождения не находятся
Например в базе
 

Цитата:
Деревянный дом
кирпичный Дом
БигДом

в поле поиска ввожу Дом, но ничего не находит.
 
Пробовал

Код:
 
WHERE nameorg LIKE %":firmname"%
ORDER BY nameorg;
 
WHERE nameorg LIKE %':firmname'%
ORDER BY nameorg;
 
WHERE nameorg LIKE %:firmname%
ORDER BY nameorg;
 
WHERE nameorg LIKE '%:firmname%'
ORDER BY nameorg;
 

 
но выходит или ошибка синтаксиса либо ничего не находит
 
Какой запрос должен быть если нужно найти организации в названии которых имеется вхождения по заданному критерию
В базе около 1000 строк
Надеюсь все понятно изложил  =)

Всего записей: 1 | Зарегистр. 17-12-2010 | Отправлено: 21:26 17-12-2010
KillaJ

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер!Я хочю добавить в этот запрос, чтобы если Holdings.holdingAccountNumber совпадает с Orders.Security as Инструмент, то тогда выводить второй запрос.Так же, непонятно если убираю строки Счет из обоих Select, то выдает ошибку.Подскажите пож-та!!!
 

Код:
Select Orders.SentTime as Время_Выставления
            , Orders.Security as Инструмент
           , sidewinder.dbo.fGetAccountNumberFromBrokerReference(Comment) as Счет
    , Orders.Qty as Количество
    , Orders.Tradeside as Операция
    , Orders.Price as Цена
    , Orders.Value as Сумма
    , Orders.Status as Статус
    
    From [Buffer].[dbo].Orders
where '171'=  sidewinder.dbo.fGetAccountNumberFromBrokerReference(Comment)
 
Union
Select Holdings.holdingPurchaseDate as Время_Выставления
    , Holdings.holdingSecDisplayName as Инструмент
             , Holdings.holdingAccountNumber as Счет
    , Holdings.holdingQty as Количество
    ,  'Наличие' as Операция  
    , Holdings.holdingPrice as Цена
    , Holdings.holdingValue as Сумма
    , 'Портфель' as Статус
    
From [sidewinder].[dbo].Holdings
where '171'=  Holdings.holdingAccountNumber
 
 
Order By Счет, Инструмент, Цена

 

Всего записей: 14 | Зарегистр. 01-10-2010 | Отправлено: 22:29 17-12-2010 | Исправлено: KillaJ, 20:44 19-12-2010
dtuyghfdt

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
isem

Цитата:
inner join predm on predm.predm_id = lect.predm_id

 почему еще надо пробегать по предметам?до сих пор не понимаю..

Всего записей: 32 | Зарегистр. 08-10-2008 | Отправлено: 23:22 17-12-2010
dtuyghfdt

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
isem
запрос не работает так нужно(((

Всего записей: 32 | Зарегистр. 08-10-2008 | Отправлено: 19:18 19-12-2010
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dtuyghfdt
Запрос же аналогичен запросу про книги, авторов и читателей (запрос в SQL синтаксисе  Access)

Код:
 
Select STUD.* From STUD
Where STUD.STUD_ID In
(Select SInfo.STUD_ID
Form
(Select PREP.PREP_ID, Count(LECT.PREDM_ID) As PCount
      From PREP Inner Join LECT On (PREP.PREP_ID = LECT.PREP_ID)
      Where PREP.NAME In ('FirstName', 'SecondName', 'LastName')
      Group By PREP.PREP_ID) As PInfo
Inner Join
(Select STUD.STUD_ID, LECT.PREP_ID, Count(LECT.PREDM_ID) As SCount
      From (STUD Inner Join GRP (On STUD.GRP_ID = GRP.GRP_ID))
      Inner Join LECT (On LECT.GRP_ID = GRP.GRP_ID)
      Group By STUD.STUD_ID, LECT.PREP_ID) As SInfo
Where (PInfo.PREP_ID = SInfo.PREP_ID) And (PInfo.PCount = SInfo.SCount))
 

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 06:07 20-12-2010
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DaImeR

Код:
SELECT * FROM main  where UCase(nameorg) like UCase('*:firmname*')


Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 11:53 21-12-2010
yarrr

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помощи:  
есть 3 табл.:  
1.  
id | имя | фамилия  
2.  
idA| id |что то еще  
3.  
idB| id  
 
 
нужна выборка поля id из 3 батл кроме тех что встречаются в табл 2 и отсортированны по табл 1.фамилия  
 
уже который час не могу сотворить...
 
Пытаюсь сделать так  
 
user.id - new_entry.user_id - club_user.user_id - это и есть id из моего первого примера.  
 
SELECT * FROM new_entry, club_user, user  WHERE (new_entry.user_id!='' AND new_entry.user_id!=user.id AND new_entry.id_sorevnovaniy= '131') AND club_user.club_id="13" AND user.id=club_user.user_id order by user.last_name  
 
но в результате записи дублируются

Всего записей: 134 | Зарегистр. 28-03-2005 | Отправлено: 18:13 22-12-2010
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yarrr
Какая СУБД?
 
выбрать айди
с таблицы1
где айди существует в таблице3  
  и айди не существует в таблице2
отсортитовать фамилия

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 19:29 22-12-2010
yarrr

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
volser MySqL
да я так вроде и делаю
но что то не получается

Всего записей: 134 | Зарегистр. 28-03-2005 | Отправлено: 19:38 22-12-2010 | Исправлено: yarrr, 20:23 22-12-2010
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yarrr
А по конкретнее, можно?
Если не выводить из 2 таблицы встречающиеся id, то что тогда из неё выводить? Связывать то по чему?
И не встречающиеся во 2 таблице id, в которой не должны встречаться в 1 или в 3?
Если выводить данные только из 1 и 3, не имеющие id во второй, то
 
Select tab1.*, tab3.* From tab1 Inner Join tab3 On (tab1.id = tab3.id)
Where (tab1.id Not In (Select id From tab2)) And (tab3.id Not In (Select id From tab2))
 
P. S. Если база данных не поддерживает Inner Join, то соединение tab1 и tab3 в Where

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 03:07 23-12-2010
yarrr

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri
 
Выводить нужно id из 3табл, не встречающиеся во 2й. а по первой просто сортировать.

Всего записей: 134 | Зарегистр. 28-03-2005 | Отправлено: 09:18 23-12-2010
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yarrr
Select tab1.*, tab3.* From tab1 Inner Join tab3 On (tab1.id = tab3.id)
Where tab3.id Not In (Select id From tab2) Order By tab1.last_name
или без Join
Select tab1.*, tab3.* From tab1, tab3
Where (tab1.id = tab3.id) And (tab3.id Not In (Select id From tab2)) Order By tab1.last_name

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 09:34 23-12-2010 | Исправлено: AndVGri, 09:36 23-12-2010
noobofthenoobs

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый. Изобрел тут велосипед, можно ли как-то упростить следующую хранимку:
 

Код:
 
PROCEDURE `mybase`.testproc_safe2(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN SET @query = 'SELECT field1 FROM test_table WHERE ';
SET @param1 = param1;
SET @param2 = param2;
 
IF param1 IS NOT NULL Then
   SET @query = CONCAT(@query, 'criteria1 = ? ');
ELSE SET @query = CONCAT(@query, '? IS NULL ');
END IF;
 
IF param2 IS NOT NULL Then
   SET @query = CONCAT(@query, 'AND criteria2 = ? ');
ELSE SET @query = CONCAT(@query, 'AND ? IS NULL '); END IF;
 
PREPARE stmt FROM @query;
EXECUTE stmt USING @param1, @param2;
DEALLOCATE PREPARE stmt;
END
 

 
Тут просто пример с 2 параметрами, на деле будет 20-30, соответственно и секций IF-ELSE столько же. Смысл что если входящий параметр пустой, т.е. = NULL, то по соответствующему критерию не нужна фильтрация. Вот можно ли как-то упростить, при этом не отказываясь от placeholder'ов?

Всего записей: 71 | Зарегистр. 28-01-2009 | Отправлено: 14:07 23-12-2010
mdid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noobofthenoobs
если уж все так попробуйте поюзать IsNull

Всего записей: 1298 | Зарегистр. 13-02-2006 | Отправлено: 15:00 23-12-2010
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noobofthenoobs

Цитата:
Вот можно ли как-то упростить

1.не использовать процедуру
  ведь всеравно собираете динамику.
2. передать готовый where одним параметром
3. передать все параметры одной строкой с разделителями
и распарсить в процедуре циклом

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 17:05 23-12-2010 | Исправлено: greenpc, 17:09 23-12-2010
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noobofthenoobs
Попробуй использовать param непосредственно в WHERE без парсинга. Просто передав все параметры в процедуру и создав блок [ CASE WHEN ] для каждого param
Код:
 
SELECT field1 FROM test_table  
 
WHERE 1 = 1
 
     AND CASE WHEN param1 IS NULL  THEN 1  
           ELSE CASE WHEN [some_fields] = param1 THEN 1  
                ELSE 0 END END = 1
 
     AND CASE WHEN param2 IS NULL  THEN 1  
           ELSE CASE WHEN [some_fields] = param2 THEN 1  
                ELSE 0 END END = 1  

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:22 23-12-2010 | Исправлено: dneprcomp, 20:26 23-12-2010
yarrr

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AndVGri
Выводит одну и туже запись несколько раз. пытался сделать  без Join
может это потому что в tab2 могут быть (есть ) пустые поля id?
 
хотя нет, просите назнаю как удалить сообщение. все завелось. спасибо огромное.

Всего записей: 134 | Зарегистр. 28-03-2005 | Отправлено: 00:17 24-12-2010 | Исправлено: yarrr, 00:29 24-12-2010
noobofthenoobs

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Спасибо за вариант. Подскажите какие +/- у case-подхода, а какие у prepare+concat (не обязательно как выше у меня, а например так как ниже) или это просто больше дело вкуса?
 

Цитата:
 
PROCEDURE `mybase`.proc_prep(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN
 
SET @query = 'SELECT field1 FROM test_table WHERE 1=1';
 
IF param1 IS NOT NULL Then
SET @query = CONCAT(@q, ' AND criteria1 = ', param1);
END IF;
 
IF param2 IS NOT NULL Then
SET @query = CONCAT(@query, ' AND criteria2 = ', param2);
END IF;
 
PREPARE stmt FROM @query;  
 
EXECUTE stmt;
 
END
 

Всего записей: 71 | Зарегистр. 28-01-2009 | Отправлено: 20:48 02-01-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru