附加多个表查询的结果

时间:2016-11-02 14:14:05

标签: sql-server

我一直在高低寻找答案,但是没有找到任何关于在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
  ]]>

因为我在示例中交换了表名,所以可能存在拼写错误。

1 个答案:

答案 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>
...