2

我需要一个查询来加入一个基于其他表值的第一行的表:

 SELECT * FROM TABLEA A LEFT JOIN
    (SELECT * from TABLEB
       WHERE FIELD1 <> '3' and FIELD2 = 'D' AND A.CODE=CODE
      FETCH FIRST 1 ROW ONLY
     ) B
 on a.FIELDA = b.FIELDA
 and A.FIELDB = B.FIELDB

但是 DB2 返回 ERROR 因为不能使用A.CODE

如何解决这个问题?

4

3 回答 3

10

您需要使用嵌套表表达式

SELECT * FROM TABLEA A LEFT JOIN
  LATERAL (SELECT * from TABLEB
     WHERE FIELD1 <> '3' and FIELD2 = 'D' AND A.CODE=CODE
     FETCH FIRST 1 ROW ONLY
  ) B
on a.FIELDA = b.FIELDA
and A.FIELDB = B.FIELDB
于 2013-11-04T23:41:14.330 回答
1

这是一个高度优化的语句。 您没有从 tableb 中获取任何数据并且您选择第一行,因此您只需要存在子句。

select a.* from tablea a 
where exists (select * from tableb b 
    where a.fielda = b.fielda 
    and a.fieldb = b.fieldb 
    and b.code = a.code 
    and b.field2 = 'd' and b.field1 <> '3')
于 2013-11-05T01:04:14.523 回答
0

您可以使用 OLAP 函数row_number()根据 (fielda,fieldb,code) 组中的某些字段对记录进行排名。例如,Somefield 可能是事务 ID 或序列。order by 子句在那里是可选的,但没有它,您可能会随机选择组中的第一个记录。

 WITH B AS
 (SELECT *,
         row_number() over (partition by fielda,fieldb,code
                            order     by somefield
                           ) as pick 
    from TABLEB
    WHERE FIELD1 <> '3'
      and FIELD2 = 'D'
 )
 SELECT * 
   FROM TABLEA A LEFT JOIN B

       on a.FIELDA = b.FIELDA
      and A.FIELDB = B.FIELDB
      and A.CODE   = B.CODE
   where pick=1
于 2013-11-05T05:55:13.647 回答