正如标题所暗示的......我正试图找出最快的方法,以最小的开销来确定表中是否存在记录。
示例查询:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
假设?
与'TB100'
交换...第一个和第二个查询都会返回完全相同的结果(例如... 1
用于此对话)。最后一个查询将按预期返回'TB100'
,如果表中不存在id
,则不返回任何内容。
目的是弄清楚id
是否在表中。如果没有,程序将接下来插入记录,如果是,程序将跳过它或基于该问题范围之外的其他程序逻辑执行UPDATE查询。
哪个更快,开销更少? (每个程序运行将重复数万次,并且每天将运行多次)。
(通过M $提供的JDBC驱动程序从Java运行此M $ SQL Server查询)
答案 0 :(得分:164)
EXISTS
(或NOT EXISTS
)专门用于检查是否存在某些内容,因此应该是(也是)最佳选择。它将在匹配的第一行停止,因此它不需要TOP
子句,并且它实际上不会选择任何数据,因此列的大小没有开销。您可以在此处安全使用SELECT *
- 与SELECT 1
,SELECT NULL
或SELECT AnyColumn
... (you can even use invalid expression like SELECT 1/0
and it will not break)完全不同。
IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
答案 1 :(得分:143)
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
将胜过您的所有建议,因为它会在找到第一条记录后终止执行。
答案 2 :(得分:20)
没有什么可以击败 -
SELECT TOP 1 1 FROM products WHERE id = 'some value';
您无需计算表中是否有数据。并且在不需要时不要使用别名。
答案 3 :(得分:10)
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
FROM dbo.[YourTable]
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
这种方法为你返回一个布尔值。
答案 4 :(得分:8)
您也可以使用
If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END
ELSE
BEGIN
--<Do something>
END
答案 5 :(得分:5)
不要认为有人提到过它,但是如果您确定数据不会在您下面发生变化,您可能还想要应用NoLock提示以确保在阅读时不会阻止它。 / p>
SELECT CASE WHEN EXISTS (SELECT 1
FROM dbo.[YourTable] WITH (NOLOCK)
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
答案 6 :(得分:3)
SELECT COUNT(*) FROM products WHERE products.id = ?;
这是适用于所有数据库的跨关系数据库解决方案。
答案 7 :(得分:2)
以下是确定数据库中是否存在记录的最简单,最快捷的方法 好的是它适用于所有Relational DB的
$http.post('api/NCT_UsersLogin/', credentials).success(function (response) {
//if your response status is success then redirect to another page using
$state.go('/home');
});
答案 8 :(得分:0)
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
when no_data_found then
dbms_output.put_line(i||' does not exists');
end;
答案 9 :(得分:0)
我过去曾经使用过它,它不需要全表扫描来查看是否存在某些内容。它超级快......
UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
--Do work
END
答案 10 :(得分:0)
对于那些来自MySQL或Oracle背景的人 - MySQL支持LIMIT子句选择有限数量的记录,而Oracle使用ROWNUM。
答案 11 :(得分:0)
对于 MySql,您可以使用如下所示的 LIMIT(示例在 PHP 中显示)
$sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
$result = $conn->query($sql);
if ($result -> num_rows > 0) {
echo "Value exists" ;
} else {
echo "Value not found";
}
答案 12 :(得分:0)
SQL SERVER 2012+
SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)
答案 13 :(得分:0)
为什么不简单地使用
SELECT EXISTS (SELECT 1 FROM products WHERE products.id = ?)