MySQL - 我能右连接一个值列表吗?

3

我正在尝试找到数据库表和我从其他地方获取的值列表的正确连接结果。目前为止,我有以下内容:

SELECT * 
FROM new_assets n 
RIGHT JOIN ( VALUES ('0253608','test_name1')
                  , ('2311194', 'test_name2') AS v(id, name)) ON v.name=n.name;

我不断收到语法错误,提示在 (VALUES ('0253608','test_name1'), ('2311194', 'test_name2') 附近。我做错了什么?

谢谢!


是的,但在MySQL中无法使用VALUES()FROM子句中。 - Gordon Linoff
2个回答

8

MySQL不支持在FROM子句中使用VALUES()。只需使用SELECTUNION ALL即可。此外,我会将其编写为LEFT JOIN

SELECT *
FROM (SELECT '0253608' as id, 'test_name1' as name UNION ALL
      SELECT '2311194', 'test_name2'
     ) v LEFT JOIN
     new_assets n;

对于大多数人来说,使用LEFT JOIN更加容易。它保留了第一个表中的所有行,并匹配随后表中的行;当您将它们链接在一起时,这种方式是有效的。通常比跟随链条并声明最后一个表具有所有行更容易理解。


如果值列表非常长,您建议使用LEFT JOIN还是创建TEMPORARY TABLE? - santoki3
1
我不确定Gordon的想法,但如果列表非常长,我建议您可能应该创建一个永久表,或将这些值作为新列添加到现有表中。 - Uueerdo
MySQL从8.0.19版本开始支持VALUES:https://dev.mysql.com/doc/refman/8.0/en/values.html - Tomty
使用 UNION ALL 来构建列表。 - Sarah Trees

1
为什么你不直接这样写呢?
SELECT n.*
  , CASE `name` 
    WHEN 'test_name1' THEN '0253608' 
    WHEN 'test_name2' THEN '2311194' 
  END AS id
FROM new_assets AS n
WHERE n.`name` IN ('test_name1', 'test_name2')
;

如果您使用 HAVING id IS NOT NULL 替换 WHERE ...,就可以消除重复的字符串字面值;尽管它的性能可能不如前者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接