【问题标题】:Missing data from converting OR condtion in Join to Another JOIN将 Join 中的 OR 条件转换为另一个 JOIN 时缺少数据
【发布时间】:2015-05-13 17:25:59
【问题描述】:

几天前,我询问如何将 OR 条件(左连接)更改为另一个左连接。下面是代码:

SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.ID = t2.ID
    OR (
        t1.col1 = t2.col1
        AND t1.col2 = t2.col2
        AND t1.col3 = t2.col3
        AND t2.ID IS NULL
    )

我转换为 OR 条件如下:

SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.ID = t2.ID
LEFT JOIN Table2 t3
    ON (
        t1.col1 = t3.col1
        AND t1.col2 = t3.col2
        AND t1.col3 = t3.col3
        AND t2.ID IS NULL
    )

但是我没有在单独的行中获得第二个左连接的记录。

带有OR条件的结果是这样的:

T1.ID  T2.ID
1      a
2      b
3      c
4      d

但是在左下角加入它的下面:

T1.ID  T2.ID
1      a
2      b
3      c

第 4 条记录来自第二个左连接。我怎样才能把它带入左连接。我没有按照公司标准使用 UNION ALL 的选项。

请帮忙。

谢谢

【问题讨论】:

  • 当您向查询中添加另一个表时,它不会自动生成新行。听起来您在一个表中需要两个数据集。 UNION ALL 就是您这样做的方式。很奇怪的公司标准,你不能使用 UNION ALL。关于我能想到的唯一另一件事是创建一个临时表并用两个插入语句填充它。
  • 我知道这很奇怪。我也会尝试使用临时表
  • @BogdanSahlean - 你有什么其他的建议吗.. 除了 Union All
  • 或条件需要超过 45 分钟.. 只是想优化它并使其更快。
  • @Ritesh Union All 和 Joins 是不同的概念。请参阅此处stackoverflow.com/questions/905379/… 的解释。另外,如果我错了,请纠正我,但上面的第一个查询(使用 OR)尝试访问 2 个表中的数据,但第二个查询包括第三个表。一旦你理解了这一点,试着分段运行你的查询,看看每个部分是否给你正确的结果。您也可以为此使用 CTE。除非我完全理解您的问题,否则我无法提供任何解决方案。

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


【解决方案1】:

首先请注意,您在第二个左连接中使用的是 t2 而不是 t3:

SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.ID = t2.ID
LEFT JOIN Table2 t3
    ON (
        t1.col1 = t3.col1
        AND t1.col2 = t3.col2
        AND t1.col3 = t3.col3
        AND t3.ID IS NULL
    )

无论如何,如果不了解您要做什么以及您希望如何查看结果,就很难回答您。

【讨论】:

  • T2 和 T3 是同一张表。我必须从具有两组不同条件的同一张表中获取数据。。(使用 OR 条件检查我的问题)。任何属于两个连接的记录条件不显示第二个连接记录。
【解决方案2】:

您正在使用左连接,它只为您提供左结果集中的所有内容。由于您想要来自右侧的 t3 的数据,因此根据您的要求将第二个左连接更改为右连接或完全连接。以下查询之一可以为您提供正确的结果:

编辑 14-03-2015

SELECT *
FROM Table1 t1
FULL OUTER JOIN Table2 t2
ON t1.ID = t2.ID
FULL OUTER JOIN Table2 t3
ON (
    t1.col1 = t3.col1
    AND t1.col2 = t3.col2
    AND t1.col3 = t3.col3
    AND t2.ID IS NULL
)

【讨论】:

  • 我在上面的查询中试过了,他们没有给我想要的数据。无论如何感谢他的帮助
  • @Ritesh,我已经对我的答案进行了编辑。这次对两者都使用完全外连接。如果您没有使用它获取所有数据,那么您的数据本身就有问题。全外连接为您提供两个表中的所有数据。如果你得到很多空值,这意味着这些表是完全排他的。
猜你喜欢
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2013-08-24
  • 2016-12-20
  • 2012-07-13
相关资源
最近更新 更多