【问题标题】:Query left join without all the right rows from B table从 B 表中查询没有所有正确行的左连接
【发布时间】:2018-11-16 00:54:00
【问题描述】:

我有两张桌子,A 和 B。 在我的选择中,我需要来自 B 的 A + 1 列的所有列。 不幸的是,B 在 A 中的 1 行有多行(全部相同) 关于加入条件。

我试过了,但我不能用左连接将 A 中的一行与 B 中的一行隔离,例如同时保持我的选择。

我该如何做这个查询? ORACLE SQL 中的查询

提前致谢。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • “在连接条件下,B 在 A 中的 1 行有多行(所有相同)”听起来像是一个糟糕的、未规范化的数据模型。您可能需要更改此设置。

标签: sql oracle


【解决方案1】:

您可以在A 的所有列上使用group by,然后使用聚合(如maxmin)来选择任何相同的B 值:

select  a.*
,       b.min_col1
from    TableA a
left join
        (
        select  a_id
        ,       min(col1) as min_col1
        from    TableB
        group by
                a_id
        ) b
on      b.a_id = a.id

【讨论】:

  • 谢谢,但不幸的是我不能在我的 Oracle Sql Developer 中使用交叉应用。而对于下面的group by的解决方案,表A中有50列,难道没有其他解决方案可以减少冗余吗?
  • 您可以将group by 移动到子查询中,在答案中编辑
  • 对不起,但它仍然不起作用,选择 a_id , min(col1) 因为 min_col1 在修改以适合我的表名时显示无效标识符
【解决方案2】:

这对outer apply 很有用。查询的结构如下所示:

select a.*, b.col
from a outer apply
     (select top 1 b.col
      from b
      where b.? = a.?
     ) b;

通常,您只会将top 1order by 一起使用。在这种情况下,您选择哪一行似乎没有什么区别。

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2014-05-11
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多