Como posso usar query-of-consulta UNION em n-registros quando var escopo é necessário?

StackOverflow https://stackoverflow.com/questions/485212

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu gostaria de ser capaz de fazer uma consulta de uma consulta para UNIÃO um número desconhecido de registros. No entanto ao fazer uma consulta pontos-de-consulta ou suportes não são permitidos em nomes de conjunto de registros.

Por exemplo dessa falha:

<cfquery name="allRecs" dbtype="query">
    SELECT * FROM recordset[1]
    UNION
    SELECT * FROM recordset[2]
</cfquery>

Usando nomes de variáveis ??dinâmicas, como o trabalho "Recordset1", mas isso é em uma função e precisa ser-var escopo, então não posso construir os nomes de variáveis ??dinamicamente sem produzir vazamentos de memória em um objeto persistente.

Quaisquer outras ideias?

Foi útil?

Solução

tarefa difícil. Eu poderia imaginar uma solução com um loop aninhado baseado em GetColumnNames(), usando QueryAddRow() e QuerySetCell(). Não vai ser o mais eficiente, mas não é realmente lento. Depende do tamanho da tarefa, é claro.

Seu "criar uma função que combina dois conjuntos de registros" poderia ser feito muito mais eficiente quando você criá-lo a aceitar, por exemplo, argumentos dez. Modificar o SQL na mosca:

<cfset var local = StructNew()>

<cfquery name="local.union" dbtype="query">
  SELECT * FROM argument1
  <cfloop from="2" to="#ArrayLen(arguments)#" index="local.i">
    <cfif IsQuery(arguments[local.i])>
      UNION
      SELECT * FROM argument#local.i#
    </cfif>
  </cfloop>
</cfquery>

<cfreturn local.union>

Outras dicas

Depois de postar a pergunta que eu vim com uma soluções casal, mas pode haver um melhor lá fora

  • Eu poderia escrever chamado dinamicamente variáveis ??no escopo argumentos e, em seguida, referenciá-los sem o seu alcance na consulta

  • Criar uma função que aceita 2 registros como argumentos e retorna um conjunto de registros combinado. Isso pode ser enrolada sobre para adicionar progressivamente um conjunto de registros de cada vez. Tenho certeza que isso é muito ineficiente comparado a fazer todos os sindicatos em uma consulta embora.

Depois de um pouco rápido de picar ao redor, eu encontrei este: queryConcat em CFLib.org. Ele usa queryaddrow / querysetcell para concatenar duas consultas.

Eu adicionei uma função rápida (sem verificação de erros, ou validação de dados, então eu não iria utilizá-lo como está):

<cffunction name="concatenate">
     <cfset var result = arguments[1]>
     <cfloop from="2" to="#arraylen(arguments)#" index="i">
             <cfset result=queryconcat(result, arguments[i])>
     </cfloop>
     <cfreturn result>
 </cffunction>

Como um teste, eu joguei isso juntos:

O que faz, de fato, dar-lhe fred / sammy / fred.

Provavelmente não é a implementação mais eficiente, mas você sempre pode alterar o código de inserção / união para torná-lo mais rápido se você queria. Principalmente, eu estava apontando para escrever o mínimo de código possível por mim. : -)

todas as soluções adicionadas aqui deve trabalhar para você, mas gostaria de mencionar também que, dependendo da quantidade de dados que você está trabalhando e o banco de dados que você está usando, você pode ser melhor fora tentando encontrar uma maneira de fazer isso em o lado da base de dados. Com muito grandes conjuntos de registros, pode ser benéfico para escrever os registros a uma tabela temporária e selecioná-los novamente, mas de qualquer forma, se você pode de alguma forma reescrever as consultas para deixar o banco de dados de lidar com isso, em primeiro lugar você será em melhor situação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top