对于表A中的密钥,表B和C中可能存在2个或更多个记录。也就是说,这些表中的另一个列将具有使密钥唯一的日期值。所以我想提取具有最大日期值的记录。这就是我使用max函数的原因。我知道我编码的子查询不应该包含在ON子句中,它会在join语句之前进行过滤。所以最终我想知道如何在查询中提到max子句。
实施例: 表A. 关键 - AAAAA
表B: 记录1 关键 - AAAAA 日期 - 2017年10月1日
记录2 关键 - AAAAA 日期 - 2017-10-05
我希望从表B中选择唯一的记录AAAAA / 2017-10-05
基本上来自表A的记录,其中A.c3 =' Y'应首先提取(假设它提供500条记录) 然后用表B和C连接这500条记录(左外部,以便所有匹配的记录和不匹配的记录在表B和C的列中应该有空) 在表B和C中,如果存在多个不同日期的记录,则应提取最大日期字段。
因此最终输出应包含500条记录。
答案 0 :(得分:1)
这就是你所描述的所有内容
SELECT A.A1, A.A2, B.B1, B.B2, C.C1, C.C2
FROM TABLE1 A
LEFT OUTER JOIN TABLE2 B
ON A.A1 = B.B1
LEFT OUTER JOIN TABLE3 C
ON A.A1 = C.C1
WHERE A.C3 = ‘Y’
这些行导致了您的问题...基本上强制您的外连接到内部连接。
AND B.C3 = (SELECT MAX(B3) FROM TABLE2 T1
WHERE T1.B1 = B.B1)
AND C.C3 = (SELECT MAX(C3) FROM TABLE3 T1
WHERE T1.C1 = C.C1)
如果在B或C中没有匹配,那么B.C3和/或C.C3将为NULL并且NULL不能为任何东西(或者<>到任何东西)物质)
如果您未在问题中包含上述内容,您打算完成什么?
答案 1 :(得分:1)
做到这一点?
SELECT A.A1, A.A2, B.B1, B.B2, C.C1, C.C2
FROM TABLE1 A
LEFT OUTER JOIN TABLE2 B
ON A.A1 = B.B1
LEFT OUTER JOIN TABLE3 C
ON A.A1 = C.C1
WHERE A.C3 = 'Y' and (B.B1 is null or C.B1 is null)