2010-10-08 51 views
0

这可能是一个非常简单的问题,它只是很难谷歌像“全部”这样的单词。SQL“全部”功能?

SELECT a.Id, Max(b.Number) 
FROM Table1 a 
JOIN Table2 b 
    ON a.FK = b.Id 
GROUP BY a.Id 

但是我想添加一个where子句,它指定链接到a.FK的所有b.Id都必须有值。所以基本上我不想选择b.Id的a.Id分组,其中的任何一个b.Id都是null。希望我明确说明,如果需要详细说明,请告诉我。谢谢。

编辑 - 对于一些澄清(上述变更以及查询):

Table1 
Id, FK 
1 1 
1 2 
2 3 
3 4 
3 5 
3 6 

Table 2 
Id Number 
1 1 
2 NULL 
3 10 
4 20 
5 30 
6 40 

我希望我的查询显示:

a.Id Max Number 
2  10 
3  40 

(请注意,a.Id = 1没有按”吨显示出来,因为该b.Number字段之一为空)

+0

你能提供一些样品数据和所需的输出吗? – 2010-10-08 21:37:40

+0

只要你在做一个内部连接,你应该很好。你是否得到null max(b.id)值? – Beth 2010-10-08 21:39:16

+0

在表2中,对于任何给定的Id,是否可以同时存在一个Number的NULL值和NOT NULL值? – 2010-10-08 22:36:35

回答

1
select t1.Id, max(Number) as [Max Number] 
from Table1 t1 
left join Table2 t2 ON t1.FK=t2.Id and t2.Number is not null 
group by t1.Id 
having count(distinct t1.FK) = count(distinct t2.Id) 
0

SELECT a.Id,MAX(b.Id)
FROM表1一个
JOIN表2 b
ON a.FK = b.Id
WHERE b.Id是NOT NULL
GROUP BY a.Id

+0

对不起,我在我的问题中犯了一个错误,请参阅编辑。 – Ocelot20 2010-10-08 21:45:56

1

好吧,你问我从以为你是一个完全不同的问题。我正在取代我的答案。

我要处理这个问题的方法是连接b到两次 - 一次获得b中所有匹配的行,第二次连接搜索b中的行,其中Number为null。如果不存在这样的行,那么我们知道它们都是非空的。

SELECT a.Id, Max(b1.Number) 
FROM Table1 a 
JOIN Table2 b1 ON a.FK = b1.Id 
LEFT OUTER JOIN Table2 b2 ON a.FK = b2.Id AND b2.Number IS NULL 
WHERE b2.Id IS NULL 
GROUP BY a.Id 

b2.Id只有在没有找到行的情况下才为空,其中b2.Number为null。

+0

对不起,我在我的问题中犯了一个错误,请参阅编辑。 – Ocelot20 2010-10-08 21:46:34