【问题标题】:SQL select id where id is not in a entry with multiple id in another tableSQL select id where id is not in a entry with multiple id in another table
【发布时间】:2018-11-14 19:53:22
【问题描述】:

我在数据库中有两个表,我希望从第一个表中选择所有 id,其中该 id 不在第二个表的条目中。

例如:

  • Table1 包含列 (ID, Name) 和示例数据:(1, "John"), (2, "Peter"), ... , (333, "Mary"), (433, "Rosa")
  • Table2 有列 (ID_not_like_Table1, IDs) 和样本数据:(123, "1;2;433"), (124, "2;433"), (125, "1;433"), (126, "1;433")

在这种情况下,应该返回 ID 333,因为 333 永远不会出现在 Table2 的 ID 中

那么如何创建 SQL 查询,以便我可以从 Table1 中获取 ID 不在 Table2 中的 ID 行?

如果可以在一个查询中完成,我可以在一个 php 文件中完成更多。

PS:这个话题的灵感来自这个:SQL query to find record with ID not in another table

提前感谢任何帮助

【问题讨论】:

  • 您使用的是哪个DBMS product? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag postgresql, oracle, sql-server, db2, ...
  • (1) 修复你的数据结构。不要将 id 列表存储在分隔字符串中。那是错的。您应该使用连接表。 (2) 你需要一个数据库标签。
  • 当谈到关系数据库中的表时,最好将示例数据显示为a table - 或SQL 脚本,甚至更好的是SQL Fiddle跨度>
  • 所以,我使用的是 mysql,它不是我的数据库,所以我被这个数据结构卡住了 :(

标签: mysql sql


【解决方案1】:

不要将 id 列表存储在字符串中。那是错的。错误的。错误的。错误的。为什么?

  • 数字应存储为数字,而不是字符串。
  • SQL 的字符串处理功能真的很差。
  • 应正确声明外键关系。
  • SQL 引擎无法优化字符串操作。
  • SQL 有这种非常棒的数据结构来存储列表。它被称为

也就是说,有时,我们会被其他人的非常非常非常糟糕的决定所困扰。有一些方法可以采取。您尚未指定数据库,但在标准 SQL 中您可以这样做:

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where ';' || t2.ids || ';' like '%;' || cast(t1.id as varchar(255)) || ';%';

仅当您无法修复数据模型时,才建议作为解决方法。

编辑:

MySQL 使用concat() 函数。而且,您可能需要考虑意外空格:

select t1.*
from table1 t1
where not exists (select 1
                  from table2 t2
                  where concat(';', replace(t2.ids, ' ', ''), ';') like concat('%;', cast(t1.id as varchar(255)), ';%');

【讨论】:

  • (这将排除任何可能出现的格式差异,例如 1- 与 -1 或意外的额外空格。)
  • 谢谢你,是的,这不是我自己的数据库,我必须处理它:(
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 2017-09-27
  • 1970-01-01
  • 2017-05-29
  • 2017-09-15
  • 2012-01-13
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多