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子句中,它就变成了一个内部连接。根据示例结果,您不需要内部联接。