SQL:这有什么问题"其中如果"查询?

时间:2016-02-15 10:52:42

标签: mysql sql

我选择了表格: A1 并加入 A2 加入 A1 ,加入 A3 A2 即可。
A1 .level和 A2 .level始终不为空 A3 .level表示已加入的行为空 A1 .level大于 A2 .level。
如果 A3 .level小于 A2 .level或设置为(NULL)
所以,我需要像这样的结果

╔══════════╦══════════╦══════════╗
║ 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)语句?感谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分:0)

我认为你发了一个复制/粘贴错误(指定要在from之后选择的字段)并将逗号放在错误的位置(在第一次加入之前)。 此外,您需要关于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)