2011-09-23 14 views
5

Tenemos 2 mesas con estructura idéntica y en base a una variable que queremos elegir qué tabla para seleccionar el sin tener que escribir 2 consultas en mi procedimiento.¿Puedo escribir una consulta tiene una mesa de selección condicional

¿Esto es posible?

me trataron

declare @table int 
set @table = 1 

Select orderID, Quantity 
from case when @table = 1 then tblOrders else tblSubscriptionOrders end 
where filled = 0 

Pero eso no funcionó

Respuesta

6

Usted tendría que utilizar SQL dinámico para esto (suponiendo que usted quiere escalar a más de sólo 2 mesas), que funcionaría, pero es subóptimo ya que SQL no generará estadísticas para él y tendrá más dificultades para optimizar la consulta.

declare @table sysname 
declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 

o, en un procedimiento almacenado:

CREATE PROCEDURE p_ConditionalSelect @table sysname 
as 

declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 
+0

+1. Lo más probable es que esto supere a mi 'solución' sindical. –

+0

Estaba tratando de evitar escribir una sp para una ejecución única, aunque parece ser la solución que tengo que hacer porque el resultado final es más complicado que la muestra fácil que puse. – Chad

3

Una opción es utilizar SQL dinámico pero si el rendimiento no es un problema inmediato, mucho más simple es simplemente UNION las tablas y añadir un maniquí [table] columna para seleccionar.

SELECT orderID, Quantity 
FROM (
    SELECT [table] = 1, orderID, Quantity 
    FROM tblOrders 
    UNION ALL 
    SELECT [table] = 2, orderID, Quantity 
    FROM tblSubscriptionOrders 
) t 
WHERE t.Table = @table 
4

Si se trata de sólo dos mesas que podría hacer:

Declare @table = 1 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND @Table = 1 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND @Table = 2 

El filtro de @table dará lugar a sólo una de las dos mitades que muestran los datos.

+0

+1 no probado, pero supongo que esta sería la solución más rápida presentada hasta ahora. –

2

Puede probar este

declare @table int 
set @table = 1 

Select orderID, Quantity 
From tblOrders 
Where @table = 1 
And filled = 0 

UNION ALL 

Select orderID, Quantity 
From tblSubscriptionOrders 
Where @table = 2 
And filled = 0 

o esto:

declare @table int 
set @table = 1 

if @table = 1 
    Select orderID, Quantity 
    From tblOrders 
    Where filled = 0 
else if @table = 2 
    Select orderID, Quantity 
    From tblSubscriptionOrders 
    Where filled = 0 
Cuestiones relacionadas