2017-06-06 63 views
0

遗憾的响应后期加入。左外有3个表和子查询

对于表A中的键,可以有2个或更多的记录存在于表B和C即,在这些表中彼此列将具有将被制造的键独特的日期值。所以我想提取具有最大日期值的记录。这就是我使用最大功能的原因。我知道我编码的子查询不应该包含在ON子句中,它会在join语句之前进行过滤。所以最终我想知道如何在查询中提及max子句。

实施例: 表A 密钥 - AAAAA

表B: 记录1个 键 - AAAAA 日期 - 2017年10月1日

记录2 密钥 - AAAAA 日期 - 2017- 10-05

我想要的仅记录AAAAA/2017年10月5日从表B中进行选择

基本上从那里A.c3 =“Y”应首先萃取(假设它给500个记录) 然后加入这些500条记录与表B和C表A记录(左外,将所有匹配的记录和非匹配的记录应该在从表中B和C) 在表B和C的列的空值,如果存在的话与不同的日期超过1个结果,最大日期字段应该被提取。

因此最终的输出应包含500条记录。

+0

我不明白这个查询应该做什么。也许你应该更新你的问题并向我们展示一些示例数据。 –

+0

_编辑您的问题,并显示样本输入数据以及您期望的输出。 –

+0

看起来你也可能试图做某种形式的[tag:most-n-per-group],虽然示例和期望的数据会极大地帮助我们。 –

回答

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

只要做到这一点?

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)