如何连接Oracle中的表并更正SQL Select以获得准确的结果?[关闭]

t2a7ltrp  于 2023-05-28  发布在  Oracle
关注(0)|答案(2)|浏览(141)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
2天前关闭。
Improve this question
我有一个不是我写的SQL选择语句,它返回10,000行;它是正确:

select t.column1, t.column2, t.column3, t.column4 ... 
from table1 t 
where conditions;

当t.column1等于d.column7,t.column2等于d.column8时,我被要求在末尾添加(table 2d)中的另一列。
我试过这个:

select b.*, d.column7, d.column8, d.column9..
 from  
     (select t.column1, t.column2, t.column3, t.column4 ... 
      from table1 t 
      where conditions) b
 left outer join
     table2 d on b.column1 = d.column7
              and b.column2 = d.column8

当我运行这个select时,我得到了例如15000(超过10,000)行。也许我使用了错误的连接类型,或者我必须以另一种方式使用它。
怎么了?

fhity93d

fhity93d1#

简单的怎么样

select t.column1, t.column2, t.column3, t.column4, d.column7, d.column8 
from table1 t join table2 d on b.column1 = d.column7
                           and b.column2 = d.column8
where conditions;

外部连接可能是您获得比预期更多行的原因。我并不是说它 * 必须 * 不被使用,但是-没有证据表明相反。

pkwftd7m

pkwftd7m2#

您可以将查询简化为:

SELECT t1.column1,
       t1.column2,
       t1.column3,
       t1.column4,
       -- ...
       t2.column7,
       t2.column8,
       t2.column9
       -- ...
FROM   table1 t1
       LEFT OUTER JOIN table2 t2
       ON     t1.column1 = t2.column7
          AND t1.column2 = t2.column8
WHERE  conditions
  • 注意:如果table1table2中有重复的行,并且满足连接条件,那么您将获得结果集的该子集的交叉乘法。因此,如果有3行t1.column1t1.column2分别具有值12,并且有2行t2.column7t2.column8具有相同的值,则输出中将有3x2 = 6行。这就是您的额外行的来源。*

如果你不想要额外的行,那么你需要将一个表中的每一行与另一个表中的最多一行匹配:

SELECT t1.column1,
       t1.column2,
       t1.column3,
       t1.column4,
       -- ...
       t2.column7,
       t2.column8,
       t2.column9
       -- ...
FROM   table1 t1
       LEFT OUTER JOIN LATERAL (
         SELECT t2.*
         FROM   table2 t2
         WHERE  t1.column1 = t2.column7
         AND    t1.column2 = t2.column8
         ORDER BY something
         FETCH FIRST ROW ONLY
       ) t2
       ON 1 = 1 -- The join condition is in the lateral query.
WHERE  conditions

相关问题