Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一列中链接五个不同的表_Sql_Sql Server_Left Join_Case - Fatal编程技术网

Sql 在同一列中链接五个不同的表

Sql 在同一列中链接五个不同的表,sql,sql-server,left-join,case,Sql,Sql Server,Left Join,Case,我正在进行一个查询,以链接五个表的结果依赖于一个值,但我无法得到我需要的结果,因为结果给了我5个不同的列(CodigoProyecto),我只需要在一个中链接这些,查询: SELECT TES_CarteraPrevisiones.CodigoEmpresa, TES_CarteraPrevisiones.IdDelegacion, TES_CarteraPrevisiones.IdPrevision, TES_CarteraPrevisiones.CodigoTipoPrevision

我正在进行一个查询,以链接五个表的结果依赖于一个值,但我无法得到我需要的结果,因为结果给了我5个不同的列(CodigoProyecto),我只需要在一个中链接这些,查询:

SELECT     TES_CarteraPrevisiones.CodigoEmpresa, TES_CarteraPrevisiones.IdDelegacion, TES_CarteraPrevisiones.IdPrevision, TES_CarteraPrevisiones.CodigoTipoPrevision, 
                      TES_CarteraPrevisiones.TipoPrevision, TES_CarteraPrevisiones.EjercicioDocumento, TES_CarteraPrevisiones.SerieDocumento, 
                      TES_CarteraPrevisiones.NumeroDocumento, TES_CarteraPrevisiones.FechaDocumento, TES_CarteraPrevisiones.NumeroOrdenEfecto, 
                      TES_CarteraPrevisiones.Comentario, TES_CarteraPrevisiones.CodigoClienteProveedor, TES_CarteraPrevisiones.CodigoCuenta, 
                      TES_CarteraPrevisiones.Contrapartida, TES_CarteraPrevisiones.CodigoCanal, TES_CarteraPrevisiones.CodigoTipoEfecto, TES_CarteraPrevisiones.ClaseEfecto, 
                      TES_CarteraPrevisiones.FechaOperacion, TES_CarteraPrevisiones.FechaValor, TES_CarteraPrevisiones.ImporteEfecto, TES_CarteraPrevisiones.Bloqueo, 
                      TES_CarteraPrevisiones.MovPosicionOrigen, TES_CarteraPrevisiones.FechaProceso, TES_CarteraPrevisiones.UsuarioProceso, TES_CarteraPrevisiones.Prevision, 
                      TES_CarteraPrevisiones.TipoEfecto, TES_CarteraPrevisiones.Comentarios, 
                      CASE WHEN TES_CarteraPrevisiones.Prevision = 'C' THEN Clientes.Razonsocial ELSE Proveedores.RazonSocial END AS RazonSocial,
                      CASE WHEN TES_CarteraPrevisiones.Prevision = 'C' THEN TES_CarteraPrevisiones.ImporteEfecto ELSE 0.00 END AS ImporteCobros, 
                      CASE WHEN TES_CarteraPrevisiones.Prevision = 'P' THEN TES_CarteraPrevisiones.ImporteEfecto ELSE 0.00 END AS ImportePagos,
                      CASE WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 1 THEN ResumenCliente.CodigoProyecto ELSE NULL END AS CodigoProyecto,
                      CASE WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 2 THEN ResumenProveedor.CodigoProyecto ELSE NULL END AS CodigoProyecto,
                      CASE WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 9 THEN TES_Presupuestos.Comentario ELSE NULL END AS CodigoProyecto,
                      CASE WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 11 THEN CabeceraPedidoCliente.CodigoProyecto ELSE NULL END AS CodigoProyecto,
                      CASE WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 12 THEN CabeceraPedidoProveedor.CodigoProyecto ELSE NULL END AS CodigoProyecto
FROM         TES_CarteraPrevisiones LEFT OUTER JOIN
                      Proveedores ON TES_CarteraPrevisiones.CodigoEmpresa = Proveedores.CodigoEmpresa AND 
                      TES_CarteraPrevisiones.CodigoClienteProveedor = Proveedores.CodigoProveedor AND TES_CarteraPrevisiones.Prevision = 'P' LEFT OUTER JOIN
                      Clientes ON TES_CarteraPrevisiones.CodigoEmpresa = Clientes.CodigoEmpresa AND TES_CarteraPrevisiones.CodigoClienteProveedor = Clientes.CodigoCliente AND 
                      TES_CarteraPrevisiones.Prevision = 'C'
                      LEFT OUTER JOIN ResumenCliente on ResumenCliente.CodigoEmpresa=TES_CarteraPrevisiones.CodigoEmpresa 
and ResumenCliente.EjercicioFactura=TES_CarteraPrevisiones.EjercicioDocumento 
and ResumenCliente.SerieFactura=TES_CarteraPrevisiones.SerieDocumento
and ResumenCliente.NumeroFactura=TES_CarteraPrevisiones.NumeroDocumento

LEFT OUTER JOIN ResumenProveedor on ResumenProveedor.CodigoEmpresa=TES_CarteraPrevisiones.CodigoEmpresa 
and ResumenProveedor.EjercicioFactura=TES_CarteraPrevisiones.EjercicioDocumento 
and ResumenProveedor.SerieFactura=TES_CarteraPrevisiones.SerieDocumento
and ResumenProveedor.NumeroFactura=TES_CarteraPrevisiones.NumeroDocumento

LEFT OUTER JOIN TES_Presupuestos on TES_Presupuestos.CodigoEmpresa=TES_CarteraPrevisiones.CodigoEmpresa 
and TES_Presupuestos.EjercicioPresupuesto=TES_CarteraPrevisiones.EjercicioDocumento 
and TES_Presupuestos.SeriePresupuesto=TES_CarteraPrevisiones.SerieDocumento
and TES_Presupuestos.NumeroPresupuesto=TES_CarteraPrevisiones.NumeroDocumento

LEFT OUTER JOIN CabeceraPedidoCliente on CabeceraPedidoCliente.CodigoEmpresa=TES_CarteraPrevisiones.CodigoEmpresa 
and CabeceraPedidoCliente.EjercicioPedido=TES_CarteraPrevisiones.EjercicioDocumento 
and CabeceraPedidoCliente.SeriePedido=TES_CarteraPrevisiones.SerieDocumento
and CabeceraPedidoCliente.NumeroPedido=TES_CarteraPrevisiones.NumeroDocumento

LEFT OUTER JOIN CabeceraPedidoProveedor on CabeceraPedidoProveedor.CodigoEmpresa=TES_CarteraPrevisiones.CodigoEmpresa 
and CabeceraPedidoProveedor.EjercicioPedido=TES_CarteraPrevisiones.EjercicioDocumento 
and CabeceraPedidoProveedor.SeriePedido=TES_CarteraPrevisiones.SerieDocumento
and CabeceraPedidoProveedor.NumeroPedido=TES_CarteraPrevisiones.NumeroDocumento

ORDER BY CodigoProyecto, TES_CarteraPrevisiones.TipoPrevision, TES_CarteraPrevisiones.EjercicioDocumento, TES_CarteraPrevisiones.SerieDocumento, TES_CarteraPrevisiones.NumeroDocumento, TES_CarteraPrevisiones.CodigoClienteProveedor
我不知道我是否已经解释清楚了


谢谢你的帮助

一个case语句中可以有多个项,只需根据需要添加任意多个
WHEN
子句即可

CASE 
  WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 1 THEN ResumenCliente.CodigoProyecto 
  WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 2 THEN ResumenProveedor.CodigoProyecto
  WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 9 THEN TES_Presupuestos.Comentario
  WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 11 THEN CabeceraPedidoCliente.CodigoProyecto 
  WHEN TES_CarteraPrevisiones.CodigoTipoPrevision = 12 THEN CabeceraPedidoProveedor.CodigoProyecto 
  ELSE NULL 
END AS CodigoProyecto

将问题最小化。两个或三个表,更少的列,更短的名称。为什么不将
case
表达式简化为
case TES_carteraprevisions.codigotiprovision当1时,则。。。当2那么。。。结束
,保存一些键入?@jarlh——因为我认为键入不如可维护性重要,而且我总是发现这更容易维护。