【问题标题】:Select id from input list NOT present in database从数据库中不存在的输入列表中选择 id
【发布时间】:2021-03-26 15:15:51
【问题描述】:

MySql 版本 8.0:

CREATE TABLE cnacs(cid VARCHAR(20), PRIMARY KEY(cid));

那么,

INSERT INTO cnacs VALUES('1');

前两条语句成功执行。然而,下一个声明没有。我的目标是从输入表 [1, 2] 返回未使用的 cid 列表:

SELECT * FROM (VALUES ('1'),('2')) as T(cid) EXCEPT SELECT cid FROM cnacs;

理论上,我希望输出为“2”,因为它尚未添加。上述查询的灵感来自 Remus 在 https://dba.stackexchange.com/questions/37627/identifying-which-values-do-not-match-a-table-row

上的回答

【问题讨论】:

  • 您使用的是哪个 dbms?并非所有产品都具有 SQL-2016 之外的以下功能:F641、行和表构造函数、F591、派生表和 F661、简单表。
  • MySQL 不支持 VALUES() 的语法。
  • 作为参考,我使用的是:dbfiddle.uk/…

标签: mysql sql select


【解决方案1】:

这至少是您尝试做的正确语法。

如果这个查询不仅仅是一个学习练习,尽管我会重新考虑这种方法,将这些 '1' 和 '2' 值(或者不管最终存在多少)存储在他们自己的表中

SELECT Column_0
  FROM (SELECT * FROM (VALUES ROW('1'), ROW('2')) TMP) VALS
  LEFT
  JOIN cnacs
    ON VALS.Column_0 = cnacs.cid
 WHERE cnacs.cid IS NULL

【讨论】:

  • 完美,谢谢。在这种特定情况下,我只需要一个唯一 ID,因此我只需将 LIMIT 1 附加到您的查询并获得 1 行作为回报
  • 我在初学者的错觉中认为所有 SQL 语言在语法上大多是统一的
  • @ThomasBraun 有很多共同点,所有主要的 DBMS 产品都支持 ansi 标准,但除此之外,每个产品都有自己的特点。不管出于何种原因,MySql 确实比大多数人有更多的细节。
  • sql语言之间转换有好的服务吗?我想要 pgsql、sqlite 和 mssql 中的查询
  • @ThomasBraun 可能有一些工具声称可以做到这一点,但根据我的经验,做出这样声明的工具很少能达到销售宣传的效果。如果可移植性很重要,您最好的选择是尽可能接近 ansi 标准,并且仅在提供显着简化时才使用特定于平台的 sql。例如,早期的 MySql 版本不支持窗口函数,但它们确实可以简化查询。您可以使用像 sqlfiddle.com 这样的工具来检查给定的查询/语法是否可以在每个平台上运行。
猜你喜欢
  • 2020-02-11
  • 2019-07-09
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2015-10-19
相关资源
最近更新 更多