2012-02-20 66 views
0

表结构如下:甲骨文 - 缺少右括号

注意:使用的名称是仅用于说明目的。

表T1 - COL1 INT,COL2 CHAR,COL3 VARCHAR

表T2 - COL1 INT,COL2 VARCHAR COL3 CHAR

表T3 - COL1 INT - 从表2 COL2 INT COL1 - 从工作台T COL2 col3 INT

SELECT tt1.col2, COUNT(tt1.col1) FROM T1 tt1, T2 tt2, T3 tt3 WHERE tt2.col1 = tt3.col1 AND  
tt3.col2 = tt1.col1 GROUP BY tt1.col1, tt1.col2 HAVING EVERY (tt2.col3 = 'something'); 

这显示与问题标题相匹配的错误;但是,如果删除条款,则不会报告错误。

查询语法正确吗?

+2

你想要做什么?你可以将'having'子句移到'where'中。具体问题是您添加了“EVERY”一词,这不是Oracle语法。 – Ben 2012-02-20 13:18:40

+0

@Ben:如果我需要每一个检查每个元组是否有col3中的'something',在表tt2中怎么办? – user980411 2012-02-20 13:20:18

+1

然后,它仍然可以在“where”条款中使用。您正在使用隐式内部联接,因此您不会错误地将外部联接转换为内部联接。 – Ben 2012-02-20 13:22:14

回答

2
SELECT tt1.col2, COUNT(tt1.col1) 
FROM T1 tt1 
JOIN T3 tt3 ON (tt3.col2 = tt1.col1) 
JOIN T2 tt2 ON (tt2.col1 = tt3.col1) 
WHERE tt2.col3 = 'something' 
GROUP BY tt1.col2; 

它似乎并不需要一个HAVING子句。在您的GROUP BY执行后需要过滤结果时,您可以使用HAVING子句。例如,如果只需要计数(tt1.col1)大于10的记录,则可以使用HAVING子句。 (HAVING count(tt1.col1)> 10)

+0

谢谢。这工作。 – user980411 2012-02-20 13:35:28

+1

很高兴听到它。并不是说这个语句有必要工作,因为你可以写更类似于原始查询的东西,但我总是更喜欢显式连接语法。在我看来,关于如何连接表格的可读性和显而易见性更强,而逻辑上的逻辑位于ON子句中,而不是WHERE子句中的其他过滤操作。 – 2012-02-20 13:38:48