【问题标题】:SQL Server - Inner Join On - Conditional StatementSQL Server - 内部加入 - 条件语句
【发布时间】:2014-08-02 08:39:10
【问题描述】:

我使用的是 SQL Server 2008 并且有以下场景:

我有 Table a 字段 idgroupId

我也有 Table b 字段 idgroupId

Table b 中的规则是:

If a.id = 0, then a.groupId = b.groupId
Else a.id = b.id (in which case a.groupId = 0)

这两个表也由agrId 链接,这样a.agrId = b.agrId

如何在满足上述规则的同时加入这些表?

更新:抱歉,我已经更新了规则并在下面添加了我的尝试:

select * from a
inner join b
on a.agrId = b.agrId
where (
    (b.id > '0' and b.groupId = '0') 
    or
    (b.groupId > '0' and b.id = '0')
  )

【问题讨论】:

  • 你能举个例子吗?
  • ID 和 GroupID 中的任何一个都将具有值...对吗?
  • 您可以使用 CASE 等加入“条件”,但如果您追求高性能,则使用专门的查询会更好。
  • 加入什么? ID = 0,加入GroupID,GroupID = 0,加入ID?
  • 请记住,在JOINs 中使用OR 会严重影响性能。你最好把它们写成 equi-joins 并做一个UNION。看看这里:stackoverflow.com/questions/5901791/…

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


【解决方案1】:

试试这个

SELECT *
FROM TableA A
INNER JOIN TableB B
    ON (B.ID = 0 AND A.groupId = B.groupId)
        OR (B.groupId = 0 AND A.id = B.id)

【讨论】:

  • 你能在你的答案中编辑任何内容吗.. 我误解了答案并投了反对票,但现在它已经超过 5 分钟了,我无法回滚它
【解决方案2】:

它需要一个计算结果为真或假的表达式,以指示是否应连接这两行。所以根据你所说的,这将是加入条件:

select  *
from    tA a 
        inner join tB b 
            on (a.id = 0 and a.groupid = b.groupid) 
            or (a.groupid = 0 and a.id = b.id)

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT *
    FROM   a INNER JOIN
           b ON a.agrId = b.agrId
    WHERE  (b.id = '0' AND b.groupId = a.groupId) 
           or
           (b.groupId = '0' AND b.id = b.id)
    

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2020-03-22
      • 2010-12-04
      • 2011-04-28
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多