【问题标题】:Can a condition for duplicate elements in a column be efficiently phrased in SQL?可以在 SQL 中有效地表达列中重复元素的条件吗?
【发布时间】:2019-04-09 10:34:17
【问题描述】:

我正在处理一个查询,我在其中连接两个表,然后只保留特别感兴趣的行。一种这样的条件是只选择在特定列中具有重复值的行。

在这种情况下,数据和值是任意的。 Team1 和 Team2 包含团队名称值,例如“Team Red”、“Team Blue”……等等

SELECT date, team1, team2, value

FROM database.team_table

INNER JOIN database.teaminfo_table ON database.team_table

WHERE 

       date >= sysdate  --example condition

AND

       --condition to only take in the specified rows

我怀疑这是否是一种有效的方式来完成我想做的事情。我想知道表达这种情况的正确方法是什么,以及是否有更好的方法来实现它。

预期结果是,假设列 Team A,如果有两个名为“Team Red”的条目,并且列中不再有此类重复项。最终结果应该是两行,每行的 Team A 值为 Team Red。

【问题讨论】:

  • 请提供样本数据、所需结果以及您正在使用的数据库的标签。
  • 你指的是逻辑intersection吗?根据您的措辞,您的要求还不是很清楚。你是指JOIN 输出,还是WHERE 子句过滤你的输出?
  • 我指的是过滤输出的 WHERE 子句,如果我不清楚,对不起,我的 SQL 目前很不稳定
  • 所以您只想返回在表中多次存在相同值组合的行?
  • 特别是如果在一列中有重复的值,比如team1 有两行Team Red,我们希望所有行都有这样的值

标签: sql conditional-statements


【解决方案1】:

针对每一行评估 WHERE 子句。

如果在结果集中保留该行的标准是同一张表中存在满足某些特征的另一行,那么要使用的WHERE子句是

WHERE EXISTS ...

所以你会得到

SELECT ... FROM TEAM_TABLE AS OUTER WHERE EXISTS ( SELECT 1 FROM TEAM_TABLE INNER WHERE INNER.whatever < / = / > OUTER.whatever )

记住还要在该内部 SELECT 中包含必要的 WHERE 子句,以确保只有与 OUTER 行不同的行才能满足条件。

例如

AND OUTER.&lt;primary key here&gt; &lt;&gt; INNER.&lt;primary key here&gt;

AND OUTER.ROWID() &lt;&gt; INNER.ROWID()

如果您使用的是具有这些 ROWID() 东西的 DBMS(如果您使用它,通常性能会稍好一些)。

【讨论】:

  • 谢谢!我会检查Where exists 条件和您的建议
猜你喜欢
  • 2016-11-23
  • 2018-08-12
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2022-10-25
  • 2010-12-20
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多