我有两个表:“su”和“wb”。在属性“su.a”和“wb.b”上在它们之间进行左连接。表“wb”还包含“l_datum”字段。期望的输出:在表之间进行左连接,但只从连接中的“wb”表中获取那些具有“wb.l_datum”字段最大值的行。DB 风味:Teradata 你能帮帮我吗?
问问题
104 次
7 回答
1
不确定 teradata,但在常规 sql 中你会这样做:
select su.*, wb.*
from su
join wb on su.a = wb.b
join (
select wb.b as b, max(wb.l_datum)
from wb
group by wb.b
) t on wb.b = t.b
于 2013-03-07T09:34:56.497 回答
0
如果您不希望使用额外的连接......您是否考虑过利用易失性表将处理分成多个步骤?
-- get max wb table records
CREATE VOLATILE TABLE vt_01_wb
AS
(
SEL t1.*
FROM wb t1
LEFT JOIN (SEL b, MAX(l_datum) max_l_datum FROM wb GROUP BY 1) t2
WHERE t1.l_datum = t2.max_l_datum
)
WITH DATA PRIMARY INDEX(b)
ON COMMIT PRESERVE ROWS;
CREATE VOLATILE TABLE vt_02
AS
(
SEL su.*, wb.*
FROM su
-- volatile table already contians max l_datum
LEFT JOIN vt_01_wb wb ON su.a = wb.b
) WITH DATA
ON COMMIT PRESERVE ROWS;
SEL * FROM vt_02
于 2013-03-22T20:10:07.660 回答
0
select * from wb w left join su s
on w.b=s.a
where w.l_datum=(select max(l_datum) from wb );
于 2013-03-07T09:45:00.077 回答
0
如果您使用 Window Aggregate Function 和子句将 替换为LEFT JOIN
派生表以QUALIFY
返回MAX
l_datum
b
select su.*, wb.*
from su
left join
(
select *
from wb
qualify l_datum = max(l_datum) over(partition by wb.b)
) t on wb.b = t.b
于 2013-03-07T14:12:59.990 回答
0
为确保您仍然获得su
未找到相应wb
记录的记录,您可以在加入之前过滤wb
表。每个数据库所接受的确切语法略有不同,但应该是这样的:
SELECT ...
FROM su
LEFT JOIN (
SELECT *
FROM wb
WHERE wb.l_datum = (
SELECT MAX(wb_maxdatum.l_datum)
FROM wb AS wb_maxdatum)
) AS wb_filtered
ON wb_filtered.b = su.a
你也可以试试
WHERE wb.l_datum = (
SELECT MAX(wb_maxdatum.l_datum)
FROM wb AS wb_maxdatum
WHERE wb_maxdatum.b = wb.b)
取每行的最大日期b
,而不是所有行。
于 2013-03-07T09:54:45.217 回答
0
select a
from su
left join wb
on (su.a = wb.b)
where wb.l_datum = (select max(l_datum) from wb)
于 2013-03-07T09:35:02.843 回答
0
一般来说,我能想到的是:
SELECT col1, col2...
FROM su
LEFT OUTER JOIN wb
ON
su.a = wb.b
WHERE
wb.l_datum = (SELECT max(l_datum) FROM wb)
但我认为,您需要多个最大数据,具体取决于组。在这种情况下,请使用 GROUP BY
于 2013-03-07T09:36:21.763 回答