sql 循环查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 循环查询相关的知识,希望对你有一定的参考价值。
表:单号,价格
把表价格一样的单号串联起来重组表单号字串,价格。
能用循环写?
游标暂不考虑
单号 价格 单号串 价格
1 50 1,2 50
2 50 3 60
3 60
MSSQL 数据库下实现:
CREATE TABLE #TEMP (单号 INT, 价格 FLOAT)INSERT INTO #TEMP VALUES(2,50)
INSERT INTO #TEMP VALUES(1,50)
INSERT INTO #TEMP VALUES(3,60)
INSERT INTO #TEMP VALUES(4,60)
INSERT INTO #TEMP VALUES(7,60)
INSERT INTO #TEMP VALUES(8,60)
DECLARE @REFID INT
, @ORDERID VARCHAR(30)
, @JIAGE VARCHAR(100)
SELECT REFID = IDENTITY(INT , 1, 1), DealFlg = 0, 单号,价格
INTO #Temp_Lists
FROM #TEMP
SELECT @REFID = MIN(REFID) FROM #Temp_Lists WHERE DealFlg = 0
CREATE TABLE #TEMP1 (单号 VARCHAR(100), 价格 FLOAT)
DECLARE @TEMPDANHAO VARCHAR
WHILE @REFID IS NOT NULL
BEGIN
SELECT @ORDERID = 单号,@JIAGE = 价格 FROM #Temp_Lists WHERE REFID = @REFID
IF EXISTS(SELECT 价格 FROM #TEMP1 WHERE 价格 = @JIAGE)
BEGIN
SELECT @TEMPDANHAO = 单号 FROM #TEMP WHERE 单号 = @ORDERID
PRINT @ORDERID
UPDATE #TEMP1 SET 单号 = convert(varchar(10),单号)+ ',' + @TEMPDANHAO WHERE 价格 = @JIAGE
END
ELSE
BEGIN
INSERT INTO #TEMP1 SELECT * FROM #TEMP WHERE 单号 = @ORDERID
END
UPDATE #Temp_Lists SET DealFlg = 1 WHERE REFID = @REFID
SELECT @REFID = MIN(REFID) FROM #Temp_Lists WHERE DealFlg = 0 AND REFID > @REFID
END
SELECT * FROM #TEMP1
DROP TABLE #TEMP1
DROP TABLE #Temp_Lists
DROP TABLE #TEMP 参考技术A 这个可以借助函数来实现, 实现一个函数, 参数为价格, 返回值为字串, 就是单号的连接; 然后在查询中调用该函数获得单号串. 参考技术B if object_id('fun_SumStr') > 0
drop function fun_SumStr
go
create function fun_SumStr(@Col1 nchar(5))
returns varchar(500)
as
begin
declare @S varchar(500)
select @S=isnull(@S,'') + Cast(OrderId as varchar(50)) from Orders where CustomerID = @Col1
return @S
end
go
Select distinct CustomerID,Col2 = dbo.fun_SumStr(CustomerID) from Orders
go
// 列名和表名换成 你自己的
// 还可以用游标实现
if object_id('temp') > 0
drop table temp
go
create table temp
(
col1 varchar(500),
col2 nchar(5)
)
go
declare @test_Cursor CURSOR
set @test_Cursor = cursor for
select CustomerID from orders group by CustomerID
open @test_Cursor
declare @chrId varchar(500)
declare @customerId nchar(5)
while @@FETCH_STATUS = 0
begin
fetch next from @test_Cursor into @customerId
set @chrId = ''
select @chrId = @chrId + cast(OrderID as varchar(50)) from orders where CustomerID = @customerId
insert into temp values(@chrId,@customerId)
end
go
select * from temp
go本回答被提问者采纳 参考技术C 用临时表,查一次把处理过的删掉,再查,一直到数据清空? 参考技术D 能先告诉我你用的是什么数据库吗?
SQL是通用的,但各数据库的函数不是通用的。
是否可以解决您的问题?
循环中的 MySQL 查询与使用 SQL 连接
【中文标题】循环中的 MySQL 查询与使用 SQL 连接【英文标题】:MySQL query in a loop vs using a SQL join 【发布时间】:2013-08-26 15:04:24 【问题描述】:我的公司内部正在就这件事上的循环查询进行内部辩论:
$sql = "
SELECT foreign_key
FROM t1";
foreach(fetchAll($sql) as $row)
$sub_sql = "
SELECT *
FROM t2
WHERE t2.id = " . $row['foreign_key'];
foreach(fetchAll($sub_sql) as $sub_row)
// ...
而不是像这样使用 sql 连接:
$sql = "
SELECT t2.*
FROM t2
JOIN t1
ON t1.foreign_key = t2.id";
foreach(fetchAll($sql) as $row)
// ...
有关此的其他信息,数据库很大,有数百万行。
我当然已经搜索过这个问题的答案,但是没有人能以好的方式回答这个问题,并且有很多赞成票让我确信一种方法比另一种更好。
问题
有人可以向我解释为什么其中一种方法比另一种更好吗?
【问题讨论】:
视情况而定。多重选择是否比连接快,没有单一的答案。您将不得不自己测试哪个更快。另请查看:***.com/questions/1067016/… 【参考方案1】:join
方法通常被认为更好,因为它减少了向数据库来回发送查询的开销。
如果您在表上有适当的索引,那么这两种方法的基本性能将是相似的。也就是说,这两种方法都将使用适当的索引来获取结果。
从数据库的角度来看,join
方法要优越得多。它将数据逻辑整合在一个地方,使代码更加透明。它还允许数据库进行在应用程序代码中可能不明显的优化。
【讨论】:
我不得不说我一般不同意,不是因为你错了,而是因为我也用 PHP 编程。我的数据通常由 3 个以上的关系关联。当您必须根据关系吐出 html 元素时,加入该数据以获取一个结果会使阅读变得越来越困难。即,一旦您进行连接,关系的知识就会丢失或难以收集,这通常在查询之后需要......但连接通常会更快。 @gunslingor 和 Gordon,我最近刚刚遇到一个问题,即未经允许为该列添加索引的数据库表很大,在这种情况下,它使用循环是否比在未索引的查询上更有效列? @tim 。 . .数据库应该仍然比循环快,因为数据只需要进出数据库一次。不过,两者都会很慢。【参考方案2】:由于驱动程序开销,循环的效率要低得多
这与我回答的另一个问题相似,但与 cv 不同。 My full answer is here 不过我总结一下要点:
每当您连接到数据库时,都会执行三个步骤:
-
与数据库的连接已建立。
对数据库执行一个或多个查询。
返回数据进行处理。
使用循环结构,最终会产生额外的驱动程序请求开销,每个循环周期都会有一个请求和一个返回,而不是单个请求和单个返回。即使循环查询不比单个大查询花费任何时间(这不太可能,因为 MySQL 内部内置了很多快捷方式来防止使用完整的重复循环),您仍然会发现单个查询更快司机开销。
使用没有TRANSACTIONS
的循环,您还会发现您会遇到关系数据完整性问题,其中其他操作会影响您在循环周期之间迭代的数据。同样,使用事务会增加开销,因为数据库必须维护两个持久状态。
【讨论】:
以上是关于sql 循环查询的主要内容,如果未能解决你的问题,请参考以下文章