2016-02-15 98 views
0

我选择表:A1并加入A2A1,和A3加入到A2
A1 .LEVEL和A2 .LEVEL始终不为空
A3 .LEVEL意味着,加入行空。
A1。级别大于A2 .level。
IF A3 .LEVEL小于A2 .LEVEL或设置好的到(NULL)
所以,我需要得到这样的SQL:这个“where if”查询有什么不对吗?

╔══════════╦══════════╦══════════╗ 
║ A1.level ║ A2.level ║ A3.level ║ 
╠══════════╬══════════╬══════════╣ 
║  3 ║  2 ║ 1  ║ 
║  14 ║  10 ║ 5  ║ 
║  15 ║  13 ║ (NULL) ║ 
╚══════════╩══════════╩══════════╝ 

我试着写声明这样

SELECT A1.level, A2.level, A3.level 
FROM A1, 
LEFT JOIN A2 ON A1.parentID = A2.id 
LEFT JOIN A3 ON A2.parentID = A3.id 
WHERE A1.level > A2.level 
     AND A2.level > A3.level OR A3.level IS NULL 

但它不起作用。如何编写IF(或CASE)的说明?谢谢

+0

'SELECT * FROM A1.level,A2.level,A3.level FROM A1'或'SELECT A1.level,A2.level,A3.level FROM A1' ??? – Praveen

+2

定义“它不工作” - 一个错误信息?错误的结果?还有别的吗? –

回答

3

您需要添加括号:

SELECT A1.level, A2.level, A3.level 
FROM A1 
JOIN A2 -- no need for LEFT JOIN 
    ON A1.parentID = A2.id 
LEFT JOIN A3 
    ON A2.parentID = A3.id 
WHERE (A1.level > A2.level) 
     AND (A2.level > A3.level OR A3.level IS NULL) 

否则优先顺序为:

NOT - AND - OR 
+0

谢谢,这是我需要的。 –

0

我想你做了一个复制/粘贴错误(你指定的字段选择后从),并在错误的地方(第一次加入之前)逗号。 此外,您需要在您的A3条件下使用括号。 我个人认为在这种情况下不需要IF声明。

SELECT A1.level, A2.level, A3.level 
FROM A1 
LEFT JOIN A2 ON A1.parentID = A2.id 
LEFT JOIN A3 ON A2.parentID = A3.id 
WHERE A1.level > A2.level 
     AND (A2.level > A3.level OR A3.level IS NULL) 
+0

我在文章中写过一个简短的查询,并且只是在这里弄错了。但是,这个例子仍然不起作用 –

2

使用括号;

SELECT A1.level, A2.level, A3.level 
FROM A1, 
LEFT JOIN A2 ON A1.parentID = A2.id 
LEFT JOIN A3 ON A2.parentID = A3.id 
WHERE 
    (A1.level is not null and A2.level is not null) and --A1.level and A2.level always not null 
    (A1.level > A2.level) and --A1.level is bigger then A2.level. 
    (A2.level > A3.level OR A3.level IS NULL) --A3.level is smaller than A2.level or setted to (NULL)