Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

SQL-запрос на проверку существование записи   Найти похожие ветки 

 
Dmitry_177   (2007-03-28 23:03) [0]

В таблице Table.DB есть поле Name, мне нужно сделать такой запрос, чтобы определить есть-ли такое имя уже или нету..
Вот так правильно будет?

SELECT Name FROM Klients.DB WHERE Name="имя"


или есть какие-то еще запросы на существование поля?


 
Sergey13 ©   (2007-03-29 08:27) [1]

count, exists


 
Johnmen ©   (2007-03-29 08:52) [2]


> мне нужно сделать такой запрос, чтобы определить есть-ли
> такое имя уже или нету..

Такая потребность говорит о кривом проектировании.


 
ЮЮ ©   (2007-03-29 09:01) [3]

1) TSession.GetFieldNames
2) DbiOpenFieldList
3) SELECT * FROM Klients WHERE <быстрое условие, возвращающее минимум строк> + TDataSet.Fields


 
Mike Kouzmine ©   (2007-03-29 09:48) [4]

Делаешь индекс где поле наме первое и делаешь setrange([name],[name]). Плучаешь всех name


 
ЮЮ ©   (2007-03-29 09:59) [5]

>ЮЮ ©   (29.03.07 09:01) [3]
Сорри. Почему-то прочитал вопрос, как "определить есть ли поле "Name" в таблице" ибо "есть какие-то еще запросы на существование поля"


Автору. Если же речь идет о существовании записей с нужным значением поля, то чем, собственно, не усраивает собственное решение? Разве что (см. TQuery.Params)
SELECT Name FROM Klients WHERE Name= :Name


 
Jan   (2007-03-29 10:11) [6]


> count, exists

count наверное лишнее....


 
Sergey13 ©   (2007-03-29 10:31) [7]

> [6] Jan   (29.03.07 10:11)

Наоборот, ИМХО, самое удобное. Ибо гарантировано вернет датасет с 1 записью с количеством найденых, в то время как в других вариантах может и не вернуть записей. И это надо учитывать при обработке результата.


 
Jan   (2007-03-29 10:54) [8]


> Наоборот, ИМХО, самое удобное.

наверное для Парадокса. Потому как в других СУБД где есть возможность вернуть скалярный результат, exists выиграет так как count это медленная операция.


 
Sergey13 ©   (2007-03-29 10:59) [9]

> [8] Jan   (29.03.07 10:54)

Почему медленная? Count(индексное поле) отработает быстро, а exists по неидексированому - как повезет. Так что не только в операторе дело + (в конкретно этом случае) я согласен с [2] Johnmen ©   (29.03.07 08:52).


 
Jan   (2007-03-29 11:01) [10]


>
> Почему медленная? Count(индексное поле) отработает быстро,
>  а exists по неидексированому - как повезет.

count должен проверить все записи удовлетворяющие условию, а exists - только первую. Разница ощутима. Ну а индексы это само собой разумеется. При одинаковых условиях exists выиграет с большим заделом.


 
Jan   (2007-03-29 11:04) [11]


> я согласен с [2] Johnmen ©   (29.03.07 08:52).

не вижу кривого проектирования для того чтобы проверить есть запись или нет.


 
Sergey13 ©   (2007-03-29 11:09) [12]

> [10] Jan   (29.03.07 11:01)
Я не отрицаю твоей правоты, но она даст ощутимые результаты не везде и не всегда. А в конкретном случае с Парадоксом надо еще постараться это вообще применить.


 
ANB ©   (2007-03-29 11:10) [13]


> count должен проверить все записи удовлетворяющие условию,
>  а exists - только первую.

На MS SQL сидим ?

В оракле, например, exists можно только в where части использовать.

А запрос select count(*) from Table1 where name = :Name and rownum <= 1
тоже очень шустро отработает, да и работу прекратит после нахождения первой попавшейся записи. А если индекс по name еще и уникальный, то и rownum <= 1 не нужен.


 
Jan   (2007-03-29 11:17) [14]


> Я не отрицаю твоей правоты, но она даст ощутимые результаты
> не везде и не всегда. А в конкретном случае с Парадоксом
> надо еще постараться это вообще применить.

убедил :) но насчет Парадокса...


 
Jan   (2007-03-29 11:18) [15]


> А запрос select count(*) from Table1 where name = :Name
> and rownum <= 1

а ты план смотрел? ты видел что он сделает сначала и когда применит rownum <= 1?


 
Johnmen ©   (2007-03-29 11:20) [16]


> не вижу кривого проектирования для того чтобы проверить
> есть запись или нет.

Вопрос автора звучит по-другому.


 
Jan   (2007-03-29 11:27) [17]


> На MS SQL сидим ?

все это можно и на FB сделать


 
Jan   (2007-03-29 11:35) [18]


> Вопрос автора звучит по-другому.

но мы то поняли что автор имел в виду вместо "поле" - "запись", "строка" и т.п.?


 
Johnmen ©   (2007-03-29 12:35) [19]


> но мы то поняли что автор имел в виду вместо "поле" - "запись",
>  "строка" и т.п.?

Я не знаю, что вы поняли. Но сути не уловили....


 
Jan   (2007-03-29 12:36) [20]


> Я не знаю, что вы поняли. Но сути не уловили....

Ну и какую же суть уловили Вы?


 
ANB ©   (2007-03-29 13:09) [21]


> а ты план смотрел? ты видел что он сделает сначала и когда
> применит rownum <= 1?

есть другой вариант ? А rownum он применит во время подсчета записей, т.е. результат может быть только 0 или 1. Тут и план смотреть не надо.


 
Jan   (2007-03-29 13:29) [22]


> А rownum он применит во время подсчета записей,

Это как?


> т.е. результат может быть только 0 или 1. Тут и план смотреть
> не надо.

не будет там 0 или 1. А план стоит посмотреть.


 
Jan   (2007-03-29 13:37) [23]


> ANB ©   (29.03.07 13:09) [21]

ты прав. извини.


 
ANB ©   (2007-03-29 14:33) [24]


> ты прав. извини.

Я вчера до 18.00 тоже думал, что не будет 0 или 1. Пока не попробовал :)


 
Anatoly Podgoretsky ©   (2007-03-29 22:37) [25]

> Sergey13  (29.03.2007 10:31:07)  [7]

А здесь не надо?
Тут придется делать лишнии шаги.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.056 c
10-1131360802
Dysan
2005-11-07 13:53
2007.04.22
не копируються данные из TWebBrowser


8-1148316794
Vasiliy
2006-05-22 20:53
2007.04.22
Подскажите как воспроизвести AVI на Texture:IDIRECT3DTEXTURE8


2-1175655995
Novice
2007-04-04 07:06
2007.04.22
Иерархия классов


15-1175157168
DVM
2007-03-29 12:32
2007.04.22
Убрать dll внутрь exe


6-1153968464
FFx01
2006-07-27 06:47
2007.04.22
Не посылается письмо размером больше 6 кб





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский