【问题标题】:sql how to add inner join and multiple conditions to filtersql如何添加内连接和多个条件进行过滤
【发布时间】:2018-01-19 17:42:11
【问题描述】:

我有这个问题

SELECT DISTINCT IP.IRId  
FROM cmp.NPTable NP
INNER JOIN IPTable IP ON IP.IPtId = NP.IPd
LEFT JOIN  IPCTable IPC ON IPC.IPId = NP.IPId  
WHERE NP.PCN Id = @PCNId  
     AND (IP.IsCompliant = 1 AND IPC.CheckId = 1) OR (IP.IsCompliant = 0 AND IPC.CheckId = 1)

这不能正常工作

IPTable 要么 IsCompliant = null, 0 要么 1 -- 这基本上是为了指示真或假 IPC.CheckId 为 1 或 2 -- 这是此表中的主 ID

唯一的匹配整数匹配是两个表之间的值 1。

如果 IsCompliant = 1 和 CheckId = 1,我只想恢复行 否则,如果 IsCompliant 为 null 或 0,则 CheckId = 2。

我添加到 where 的子句是 AND (IP.IsCompliant = 1 AND IPC.CheckId = 1) OR (IP.IsCompliant = 0 AND IPC.CheckId = 1)

这不起作用。帮助。将不胜感激。

谢谢

【问题讨论】:

  • 这里没有使用LEFT JOIN。你的WHERE 子句将你的LEFT JOIN 变成INNER JOIN
  • 嗨。左连接返回内连接行加上由空值扩展的不匹配的左表行。由于您删除了 where 中所有以空值扩展的左连接行,因此您的查询没有意义。现在:你想要什么行?你不清楚。你说“我只想带回行 [...]”但是来自哪个表/子查询?

标签: sql left-join inner-join


【解决方案1】:
WHERE NP.PCN Id = @PCNId  
AND 
(
   (IP.IsCompliant = 1 AND IPC.CheckId = 1) OR 
  ((IP.IsCompliant is null or IP.IsCompliant = 0) AND IPC.CheckId = 2)
)

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多