我一直在高低寻找答案,但是没有找到任何关于在SQL中进行此类操作的文档。基本上,我有一个参数列表太大,无法运行一个查询,所以我首先想到的是打破这个参数列表并创建一个sql脚本,该脚本获取参数列表的子集,为每个列表运行一个查询,然后将所有结果附加到一个表中。
即,第一个查询将返回...
- id | DeviceName
- 00 201341
- 01 324232
- ... ...
第二个回归......
- id | DeviceName
- 02 253242
- 03 234234
- ... ...
目标是将所有这些结果附加/组合到一个包含所有值的大表中。
是否可以在SQL中以相同的脚本执行此操作?我在MSDN上发现了类似这样的文章,但我不确定这是否真的符合我的目标。 https://msdn.microsoft.com/en-us/library/ethytz2x.aspx
我也试过在stackoverflow上搜索,但我还没有找到任何听起来像是同样问题的东西。
我不是SQL的专家,所以也许我错过了关于join和union如何工作的东西?我已经使用它们将来自不同列的信息连接到一个表中,但没有那么多来附加行。
编辑: 为了给出我正在处理的更具体的例子,这基本上是我试图修改的脚本,以避免有太多的参数......
<sql-query name="GetMyDogsStatus">
<query-param name="DogIds" type="Guid"/>
<return-scalar column="status" type="Guid"/>
<![CDATA[
DECLARE @DogIds dbo.EntityIds
INSERT INTO @DogIds (dogID)
SELECT dogID from Dogs
WHERE dogID in (:DogIds)
DECLARE @tempId uniqueidentifier
DECLARE @dogStatus varchar(255)
DECLARE @InjuredDogIds dbo.EntityIds
DECLARE cur CURSOR FOR
SELECT dogId from @DogIds
OPEN cur
FETCH next from cur
INTO @tempId
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @dogStatus = null
SELECT TOP 1 @dogStatus = ev.[Delete Status]
FROM EventsHistory ev
WHERE dogId = @tempId
AND ev.[Delete Status] IS NOT NULL
AND ev.[Delete Status] != ''
AND ev.[Delete Status] != 'Pending'
ORDER BY [Time Deleted] DESC
if(@dogStatus is not null and not (@dogStatus='healthy' or @dogStatus='incomplete health assessment'))
insert into @InjuredDogIds (dogId) values (@tempId)
FETCH next from cur
INTO @tempId
END
CLOSE cur
DEALLOCATE cur
SELECT dogid as 'status' FROM @InjuredDogIds
]]>
因为我在示例中交换了表名,所以可能存在拼写错误。
答案 0 :(得分:1)
首先,请指明它是MySQL还是sql-server。其次,检查union
的使用情况。它的目的是将几个查询的结果连接成一个数据集(条件是所有查询的结果具有相同的结构,我理解这是你的情况)。例如:
SELECT ID , DEVICENAME FROM <yourTable> WHERE <filtering condition 1>
UNION
SELECT ID , DEVICENAME FROM <yourTable> WHERE <filtering condition 2>
UNION
SELECT ID , DEVICENAME FROM <yourTable> WHERE <filtering condition 3>
...