【问题标题】:SQL Right Excluding JOIN and WHERE issuesSQL 权限排除 JOIN 和 WHERE 问题
【发布时间】:2015-11-18 00:34:42
【问题描述】:

我正在尝试创建一个权限不包括连接的视图:

但是有一个冒号,我也想在 WHERE 上做一个。在这种情况下:

WHERE table.colon != 'x';

出于这个原因我已经尝试过:

WHERE A.key IS NULL AND table.colon != 'x'; 

但是当我运行它时,运行它时没有显示任何数据。 谁能帮我解决这个问题?

提前致谢。

更新,这是我要运行的查询:

SELECT     dbo.DimServere.Servernavn, dbo.DimServere.Serverstatus, dbo.IderaPatchAnalyzer.IP_Adresse, dbo.IderaPatchAnalyzer.Release_, dbo.IderaPatchAnalyzer.Level_, 
                      dbo.IderaPatchAnalyzer.Edition_, dbo.IderaPatchAnalyzer.Build, dbo.IderaPatchAnalyzer.Updates_Available, dbo.IderaPatchAnalyzer.Supported_, 
                      dbo.IderaPatchAnalyzer.Support_Status
FROM         dbo.DimServere RIGHT OUTER JOIN
                      dbo.IderaPatchAnalyzer ON dbo.DimServere.TcpIpAddress = dbo.IderaPatchAnalyzer.IP_Adresse AND dbo.DimServere.Serverstatus <> 'Disposed/Retired'
WHERE     (dbo.DimServere.TcpIpAddress IS NULL)

【问题讨论】:

  • 为您正在使用的数据库类型添加标签。您也可以根据自己的口味考虑使用MINUSSUBTRACTEXCEPT
  • @Glenn 我使用的是 SQL Server 2008 R2 和 Microsoft SQL Server Management Studio 2012
  • table.colon 来自哪里?
  • @vkp from table a,我将使用查询更新帖子

标签: sql sql-server-2008 join right-join


【解决方案1】:

将条件移到 JOIN 子句中。

SELECT *
FROM 
    Table1
    LEFT JOIN Table2
        ON Table1.Field = Table2.Field AND
        Table2.OtherField != 'x'
WHERE Table2.Field IS NULL

【讨论】:

  • 嗯,我已经运行了它,仍然没有结果
  • 没有结果是什么意思?根本没有行回来?还是返回了意想不到的结果?
  • 没有任何行返回。只是空白。如您所见,我已使用查询更新了帖子。包括你让我尝试的。
  • 只有当 dbo.DimServere 中的每个 tcp ip 地址在 dbo.IderaPatchAnalyzer 中都有一个匹配的 tcp ip 地址并且它们都没有完全等于“Disposed/Retired”时才会发生这种情况。我注意到状态中有一个斜线,是两种不同的状态还是只有一种状态?
  • 有一个匹配项。当我删除 where != 'disposed/retired' 时,它可以工作。以及它的一种状态。
【解决方案2】:

这个想法是正确的。但是,我猜dbo.DimServere.Serverstatus 列中有null 值。因为您使用的是比较运算符,所以此条件总是失败(与null 的比较未知)并且不满足join 条件,(因为您正在使用另一个条件ANDing)并且您没有得到任何结果。

要克服这个问题,请在join 条件中使用isnull(dbo.DimServere.Serverstatus, 'somevalue')

SELECT dbo.DimServere.Servernavn, dbo.DimServere.Serverstatus,
dbo.IderaPatchAnalyzer.IP_Adresse, dbo.IderaPatchAnalyzer.Release_,
dbo.IderaPatchAnalyzer.Level_, dbo.IderaPatchAnalyzer.Edition_, 
dbo.IderaPatchAnalyzer.Build, dbo.IderaPatchAnalyzer.Updates_Available,    
dbo.IderaPatchAnalyzer.Supported_, dbo.IderaPatchAnalyzer.Support_Status
FROM dbo.DimServere RIGHT OUTER JOIN
dbo.IderaPatchAnalyzer ON dbo.DimServere.TcpIpAddress = dbo.IderaPatchAnalyzer.IP_Adresse 
AND isnull(dbo.DimServere.Serverstatus, 'somevalue') <> 'Disposed/Retired' 
WHERE dbo.DimServere.TcpIpAddress IS NULL

【讨论】:

  • 否定,我刚刚运行了 SELECT * FROM [SIT-DVH].[dbo].[DimServere] WHERE Serverstatus IS NULL;并没有出现任何行。
  • 你试过没有where子句吗?只是为了检查
  • 是的,我已经尝试了没有 AND dbo.DimServere.Serverstatus 'Disposed/Retired' 的查询,然后它就可以工作了。但我只需要从右侧查看数据。
  • 对不起,我的意思是,我只需要查看右侧没有 Serverstatus 中的 Disposed/Retired 值
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2017-02-04
  • 2021-09-22
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多