Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.088 c
1-1172676041
DenisNew
2007-02-28 18:20
2007.04.22
ширина закладки ttabsheet


15-1174864148
Джо
2007-03-26 03:09
2007.04.22
Потоп


15-1174956277
Бакук
2007-03-27 04:44
2007.04.22
Хранение форм


2-1175678884
Kostafey
2007-04-04 13:28
2007.04.22
Организация модификации данных в связанных таблицах.


15-1174838996
Чувак
2007-03-25 20:09
2007.04.22
Вопрос по ошибке железа