我需要一个查询,使用其他表值的第一行来加入TABLE:
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
怎么能解决这个问题?
答案 0 :(得分:5)
您需要使用嵌套表格表达式:
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
答案 1 :(得分:1)
这是一个高度优化的声明。 你没有从tableb获得任何数据,也没有从第一行获取数据,所以你只需要exists子句。
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')
答案 2 :(得分: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