【问题标题】:MariaDB/ MySQL : Syntax error in cross join with multiple selectMariaDB/ MySQL:多选交叉连接中的语法错误
【发布时间】:2020-11-11 11:42:33
【问题描述】:

我正在尝试创建一个带有 2 个选择的交叉连接的过程。在第一个选择中,我选择vitamin_name 包含不为空的extreme 的价格值,在第二个选择中,我选择vitamin_name 不包含不为空的extreme 的价格值。我交叉加入了这些选择,但我在第 9 行不断收到语法错误。我不知道我在第 9 行做错了什么。应该怎么做?

table = vitamin
+----------------+-------+
|  vitamin_name  | price |
+----------------+-------+
| extreme pill 1 |    10 |
| pill 1         |     5 |
| extreme pill 2 |    20 |
| pill 2         |    10 |
+----------------+-------+

我的代码

BEGIN

SELECT sel_extreme.ext, sel_regular.reg FROM

(SELECT sel.extreme as 'ext' FROM
(SELECT CASE WHEN vitamin_name LIKE 'extreme%' THEN price END AS 'extreme'
FROM vitamin) AS sel
WHERE sel.extreme IS NOT NULL;) AS sel_extreme <-- line 9

CROSS JOIN

(SELECT sel.regular as 'reg' FROM
(SELECT CASE WHEN vitamin_name NOT LIKE 'extreme%' THEN price END AS 'regular'
FROM vitamin) AS sel
WHERE sel.regular IS NOT NULL;) AS sel_regular;

END

【问题讨论】:

  • 删除SQL代码中间的所有;。 AS sel_regular; 中只有一个是合法的。
  • 我照你说的做了,还是不行..
  • 也许您尝试在复合语句(函数、过程、触发器等)中使用 BEGIN-END?
  • 还有一个错误 - 您在别名上使用了错误的引号字符(AS 'extreme'、AS 'regular'、as 'ext'、as 'reg'),必须使用反引号而不是单引号。
  • 去掉多余的分号。

标签: mysql mariadb


【解决方案1】:

我的意思是下一个查询可以解决你的问题:

select 
    reg.vitamin_name,
    reg.price as regular_price,
    ext.price as extreme_price
from vitamin reg
left join vitamin ext on ext.vitamin_name = concat('extreme ', reg.vitamin_name)
where reg.vitamin_name NOT LIKE 'extreme%'
union -- add vitamins without regular form
select 
    vitamin_name,
    null,
    price as extreme_price
from vitamin ext
where vitamin_name LIKE 'extreme%' 
    and not exists (
        select vitamin_name from vitamin reg where ext.vitamin_name = concat('extreme ', reg.vitamin_name)
    )
;

来自SQLize.online的结果:

+================+===============+===============+
| vitamin_name   | regular_price | extreme_price |
+================+===============+===============+
| pill 1         | 5             | 10            |
+----------------+---------------+---------------+
| pill 2         | 10            | 20            |
+----------------+---------------+---------------+
| pill 3         | 13            | (null)        |
+----------------+---------------+---------------+
| extreme pill 4 | (null)        | 200           |
+----------------+---------------+---------------+

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2018-07-29
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多