Sql 视图的右表中具有筛选器的左联接查询 我需要一个视图的左连接查询 对于此视图,我有两个过滤器 左表和右表的参数 我需要右表中的空行

Sql 视图的右表中具有筛选器的左联接查询 我需要一个视图的左连接查询 对于此视图,我有两个过滤器 左表和右表的参数 我需要右表中的空行,sql,left-join,Sql,Left Join,第一个查询不起作用,但我可以从视图中筛选它: select * from histoStatut h left join listStatut ls on h.idstatutid = ls.idstatutid or ls.idstatutid is null where h.idRequestid = 32651 and ls.IdListeId = 9 ; CREATE VIEW AS My_Left_Join as select * from histoStatut h

第一个查询不起作用,但我可以从视图中筛选它:

select * from histoStatut h
left join listStatut ls on h.idstatutid = ls.idstatutid or ls.idstatutid is null
where h.idRequestid = 32651 and ls.IdListeId = 9 ;
CREATE VIEW AS My_Left_Join as 
  select * 
  from histoStatut h
  left join listStatut ls 
  on h.idstatutid = ls.idstatutid;

Select * from My_Left_Join where IdListeId = 9 and IdRequestId = 32651
第二个查询可以工作,但视图不接受rigth表上的筛选器:

select *
from (select * from HistoStatut)T1
left join 
  (select h.*,ls.IdListeId from HistoStatut h
     inner join ListStatut ls on h.IdStatutId = ls.IdStatutId and ls.IdListeId = 9
  ) T2 on T1.IdHistoStatut = T2.IdHistoStatut
where T1.IdRequestId = 32651

我需要一个解决方案,可以在视图上使用两个过滤器:

select * from histoStatut h
left join listStatut ls on h.idstatutid = ls.idstatutid or ls.idstatutid is null
where h.idRequestid = 32651 and ls.IdListeId = 9 ;
CREATE VIEW AS My_Left_Join as 
  select * 
  from histoStatut h
  left join listStatut ls 
  on h.idstatutid = ls.idstatutid;

Select * from My_Left_Join where IdListeId = 9 and IdRequestId = 32651
预期结果:


是否有视图的解决方案?

我不理解为什么右表上不允许使用带值的条件,因为使用
idListId=9
作为
左联接的一部分的语法在SQL Server中完全有效。我不太确定你认为什么是允许的,但这可能会有所帮助

SELECT *
FROM histoStatut h
LEFT JOIN 
(
   SELECT * 
   FROM listStatut 
   WHERE IdListeId = 9
) ls ON h.idstatutid = ls.idstatutid
WHERE h.idRequestid = 32651;
使用
右连接对查询进行的另一次重写可能是

SELECT *
FROM
(
   SELECT * 
   FROM listStatut 
   WHERE IdListeId = 9
) ls
RIGHT JOIN histoStatut h ON h.idstatutid = ls.idstatutid
WHERE h.idRequestid = 32651;

我不理解为什么右表中不允许使用带值的条件,因为在SQL Server中使用
IdListeId=9
作为
LEFT JOIN
的一部分的语法是完全有效的。我不太确定你认为什么是允许的,但这可能会有所帮助

SELECT *
FROM histoStatut h
LEFT JOIN 
(
   SELECT * 
   FROM listStatut 
   WHERE IdListeId = 9
) ls ON h.idstatutid = ls.idstatutid
WHERE h.idRequestid = 32651;
使用
右连接对查询进行的另一次重写可能是

SELECT *
FROM
(
   SELECT * 
   FROM listStatut 
   WHERE IdListeId = 9
) ls
RIGHT JOIN histoStatut h ON h.idstatutid = ls.idstatutid
WHERE h.idRequestid = 32651;

ls.idstatutid为null
在联接条件中没有意义

通过将where条件作为联接条件应用,可以将其放入正确的表中:

select * 
from histoStatut h
left join listStatut ls 
on h.idstatutid = ls.idstatutid 
and ls.IdListeId = 9
where h.idRequestid = 32651  ;

ls.idstatutid为null
在联接条件中没有意义

通过将where条件作为联接条件应用,可以将其放入正确的表中:

select * 
from histoStatut h
left join listStatut ls 
on h.idstatutid = ls.idstatutid 
and ls.IdListeId = 9
where h.idRequestid = 32651  ;

您可以跳过
ls.idstatutid为null
条件,此处不需要。什么是“rigth表上的筛选器对于视图是不可接受的”?@Remay,请显示查询的预期结果。您使用的是什么?博士后?Oracle?MSSQL。我以预期的形式和结果完成我的问题。感谢您可以跳过
ls.idstatutid为null
条件,此处不需要。什么是“rigth表上的筛选器对于视图是不可接受的”?@Remay,请显示查询的预期结果。您使用的是什么?博士后?Oracle?MSSQL。我以预期的形式和结果完成我的问题。感谢不起作用,“ls.idListId=9”必须在视图的where子句中,但这是一个很好的简化,它不起作用,“ls.idListId=9”必须在视图的where子句中,但它是一个很好的简化我需要where中的过滤器IDListIdclause@Remay如果你把它放在where子句中,它就变成了一个内部连接。根据示例结果,您不需要内部联接。我需要where中的筛选器IdListeIdclause@Remay如果你把它放在where子句中,它就变成了一个内部连接。根据示例结果,您不需要内部联接。