【问题标题】:Return row with unique values across columns of same table在同一个表的列中返回具有唯一值的行
【发布时间】:2021-04-05 08:00:49
【问题描述】:

我有这样的数据:

CODE EMAIL0 EMAIL1 EMAIL2 EMAIL3 EMAIL4 EMAIL5 EMAIL6
ABC abc@gmail.com q@gmail.com q@gmail.com f@gmail.com h@gmail.com u@gmail.com y@gmail.com
DEF def@gmail.com k@gmail.com NULL NULL NULL NULL g@gmail.com
XYZ xyz@gmail.com i@gmail.com i@gmail.com NULL NULL NULL NULL

我需要查询只返回带有CODE=DEF 的第二行,因为EMAIL1EMAIL6 都是唯一值。

基本上我需要EMAIL1EMAIL6 具有唯一值的行。 这里CODE 永远是独一无二的。

我尝试使用CROSS JOIN,但没有成功。

【问题讨论】:

  • 你真的应该修正你的设计,有 6 个电子邮件栏打破了 3NF 的基本规则之一。

标签: sql sql-server count distinct lateral-join


【解决方案1】:

如果您想要没有重复电子邮件的行,您可以将电子邮件取消透视到横向连接中的行,然后将不同的非null 值的计数与非null 值的计数进行比较:

select t.*
from mytable t
cross apply (
    select count(distinct email) cnt1, count(email) cnt2
    from (values (email0), (email1), ...) as x(email)
) x
where x.cnt1 = x.cnt2

【讨论】:

  • 我无法正确获取查询语法。我用我的实际表名替换了上述查询的 mytable,但无法编写完整的查询。
  • @jayeshkshirsagar:您正在运行哪个查询,您到底遇到了哪个错误?
  • 我写了如下查询:
  • 我已经编写了以下查询:假设我现在接受电子邮件 1 和电子邮件 2。在最终查询中,我需要比较电子邮件 1 和电子邮件 6。在 1 到 6 选择中应该没有重复t.* from QUALIFIED_UNIQUE_EMAIL_R t cross apply ( select count(distinct email_1) cnt1, count(email_2) cnt2 from (values (email_1), (email_2)) as x(email) ) x where x.cnt1 = x.cnt2 错误:消息 4101,级别 15,状态 1,第 252 行 APPLY 右侧的聚合无法引用左侧的列。
  • @jayeshkshirsagar:select count(distinct email_1) cnt1, count(email_2) cnt2 应该是 select count(distinct email) cnt1, count(email) cnt2,就像我的查询一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多