【问题标题】:SQL JOIN and LEFT JOIN the same table with differents conditionsSQL JOIN 和 LEFT JOIN 不同条件的同一张表
【发布时间】:2010-07-21 20:31:33
【问题描述】:

我需要在满足某些条件时加入一个表,并在满足其他条件时左加入它。由于我在一个带有过滤器的 MS 动态 CRM 中,我不能使用 UNION

   SELECT stuff.stuffs
     FROM MainTable    

JOINS othertable
LEFT JOIN othertables

LEFT JOIN TableX as X1 ON (Conditions1.1 = X1.1
                      AND MainTable.Type = 1)    
     JOIN TableX as X2 ON (Conditions2.2 = X2.2
                      AND MainTable.Type = 2)
  • 如果我注释掉 X2 部分,我会从 X1 部分得到我需要的东西,而从 X2 中什么也得不到。
  • 如果我 LEFT JOIN 加入 X2 部分,我在 X2 中有额外的信息。
  • 如果我保持原样,我会从 X2 部分得到我需要的东西,但从 X1 中什么也得不到。

我尝试了一些变体,但无法找到令人满意的解决方案。

编辑:我原来的查询是这样的:

SELECT stuff.stuffs
     FROM MainTable

(LEFT) JOIN TableX as X1 
         ON (Conditions1.1 = X1.1
             AND MainTable.Type = 1)    
     OR 
         ON (Conditions2.2 = X2.2
             AND MainTable.Type = 2)

但如果它是左连接,我会从 X2 获得额外的信息 和一个 JOIN 给我 X1 缺少的信息,

【问题讨论】:

  • 我们可以看看最终的查询吗?我还不清楚你需要什么。

标签: sql sql-server sql-server-2005 dynamics-crm


【解决方案1】:

实际所需的匹配在 OP 中并不清楚,但您可以尝试以下方法:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On ( MainTable.Type = 1 And X1.1 = ...)
            Or ( MainTable.Type = 2 And X1.2 = ...)

鉴于您已添加到 OP 和 cmets 中的内容,尚不清楚您是否从 TableX 中寻找满足任一条件或一个且仅一个条件的行。但是,为了完整起见,这两者都是:

任一条件:我上面的原始解决方案和您添加到帖子中的解决方案。

只有一个条件:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On X1.1 = ...
    Left Join TableX As X2
        On X2.2 = ...
Where ( MainTable.Type = 1 And X1.PK Is Not Null And X2.PK Is Null )
    Or ( MainTable.Type = 2 And X2.PK Is Not Null And X1.PK Is Null )

原始帖子中缺少的是从 TableX 到 MainTable 的外键引用的任何概念。因此,通常情况下,我会想到这样的事情:

Select stuff.stuffs
From MainTable
    Left Join TableX As X1
        On X1.FK = MainTable.PK
    Left Join TableX As X2
        On X2.FK = MainTable.PK
Where ( MainTable.Type = 1 And X1.Col1 = ...  And X2.PK Is Null )
    Or ( MainTable.Type = 2 And X2.Col1 = ... And X1.PK Is Null )

【讨论】:

  • 此解决方案为我提供了来自 X2 的额外信息,而这些信息是我不应该拥有的。一个 JOIN,会从 X1 中创建缺失的信息。
  • @Mashuu - 请提供一些示例数据和示例输出,以更好地说明您要实现的目标。目前尚不清楚您是否希望数据匹配两个条件、一个条件和一个条件、任一条件等。
  • 谢谢,使用 One 的变体并且只有一个,我(你)设法让它工作!我只需要在我的 SELECT 中添加一个简单的 CASE 就可以使一切正常!
【解决方案2】:

我想你需要试试这个:

   SELECT stuff.stuffs
     FROM TABLEX x
LEFT JOIN MAINTABLE mt1 ON mt.1 = x.1
                       AND mt.type = 1
LEFT JOIN MAINTABLE mt2 ON mt.2 = x.2
                       AND mt.type = 2

【讨论】:

  • 我无法真正做到这一点,因为我还有 9 个其他联接,并且在我需要修复的 2 个联接之前离开了。
  • @Mashuu:我们只能根据您提供的详细信息。
  • 这是真的,我很抱歉,我期待一个简单的单行答案或一个我不知道的特殊连接属性。感谢您对我的帮助,非常感谢。
  • @Mashuu:谢谢理解,保重。
猜你喜欢
  • 2018-06-28
  • 2019-05-19
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多