【问题标题】:SQL Where clause: all fields equal, except oneSQL Where 子句:所有字段相等,除了一个
【发布时间】:2016-11-29 14:56:49
【问题描述】:

我可以得到一个在所有字段中都相等的条目,除了定义吗?

例如:

SELECT a.* 
FROM table_name a 
INNER JOIN table_name b 
   on (a.price = b.price 
   AND a.quantity = b.quantity 
   AND {all the remaining params}) 
   AND a.id <> b.id

我需要找到相同的条目,除了它的 ID(重复条目)

【问题讨论】:

  • 所有剩余参数 您必须设置所有剩余参数。您可以使用自动化,例如构建所有参数的函数
  • 使用minusintersect 运算符可能是可能的,但 MySQL 不支持这些功能。所以我不得不说,“不,你不能”
  • 为什么你的最后一个条件没有包含在 ON 子句中?
  • @bub 不是那么方便,好像会有原生解决方案。还是有道理的
  • @BeS uhm,是的,只是为了可读性,“排除条件”被移出括号

标签: mysql sql inner-join distinct where


【解决方案1】:

您可以将SELECTGROUP BY 子句一起使用。 例如,如果您有一个名为 names 的表,其中有一列 name,您想要检查重复项。你可以这样做:

select name, count(*) c from names group by name having c > 1;

这还将返回一个额外的列,指示重复值在行中出现的次数。

希望对你有帮助。

【讨论】:

  • 这是我能想到的找到重复项的唯一方法,但他必须在选择和分组依据中单独列出所有 X 字段。 (注意:您可以使用系统表来生成整个列列表,因此您不必手动输入它们!)
【解决方案2】:

将您的“AND a.id b.id”更改为“WHERE a.id b.id”,这应该适合您。

【讨论】:

  • 重新阅读问题。如果一个表有 30 列,他想比较其中的 29 列并确保第 30 列不匹配;但没有列出所有列...
  • xQbert - 将最后一个 AND 更改为 WHERE 将从连接表中选择 id 不同的记录,这正是他正在寻找的。​​span>
  • 如果没有定义所有其他字段,我们怎么知道它们是相等的? Bub 在 cmets 中说“你必须列出它们”,而 Sly_huh 表示它“不方便”,*在使用 INNER 连接时,将其设置为 where 子句对结果没有影响。
  • 我假设 {all the remaining params} 意味着他将表 'a' 中的所有字段等同于表 'b' 中的相应字段
  • 不需要,关于教育的一切都在这里。我不是要粗暴(我没有投反对票)我想确保我们理解这个问题(也许我误解了)并且你的回答对内部连接没有影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多