Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在给定一个匹配项的多个列中选择所有SQL重复项_Sql_Postgresql - Fatal编程技术网

如何在给定一个匹配项的多个列中选择所有SQL重复项

如何在给定一个匹配项的多个列中选择所有SQL重复项,sql,postgresql,Sql,Postgresql,我对SQL比较陌生 在一个SQL语句中,是否有任何方法可以在SELECT语句中查找匹配项(例如…WHERE)test@test.com“),返回该电子邮件的所有匹配项以及与第一个SELECT语句的结果中的另一个指定字段匹配的任何人 例如,假设两个用户收到了电子邮件test@test.com,其中一个(或两者)的dti_id为47。表中还有dti_id为47的其他用户的电子邮件地址为test@test.com,但我希望它们都在同一个查询中返回。我可以在十几个SQL调用中找到解决方法,但我很有信心,

我对SQL比较陌生

在一个SQL语句中,是否有任何方法可以在SELECT语句中查找匹配项(例如…WHERE)test@test.com“),返回该电子邮件的所有匹配项以及与第一个SELECT语句的结果中的另一个指定字段匹配的任何人

例如,假设两个用户收到了电子邮件test@test.com,其中一个(或两者)的dti_id为47。表中还有dti_id为47的其他用户的电子邮件地址为test@test.com,但我希望它们都在同一个查询中返回。我可以在十几个SQL调用中找到解决方法,但我很有信心,在一个调用中执行联接、子查询或其他操作可以更有效地编写它

所以与其说

SELECT * WHERE email = 'test@test.com'
我想要和我做的一样的结果

SELECT * WHERE email = 'test@test.com' OR dti_id = 47 OR dti_id = 51 OR username = 'test';

将ORs添加到其中,因为它们是来自电子邮件的结果test@test.com“。

您可以通过显式自联接来实现这一点。但是,我认为使用
in
exists
in
where
子句更容易理解逻辑:

select t.*
from table t
where t.email = 'test@test.com' or
      exists (select 1
              from table t2
              where t2.dti_id = t.dti_id and
                    t2.email = 'test@test.com'
             );
这相当直接地对应于你所说的问题。从表中选择电子邮件所在的所有行,并选择某个字段中与该电子邮件所在行匹配的行


出于性能原因,此查询最好与
表(dti\U id,电子邮件)
上的索引配合使用。请向我们显示一些示例数据和预期输出(请记住,您可以使用
标记格式化文本)。在第一条注释的第二行。数据库表的模式也会有帮助。我刚刚添加了一些示例SQL,这能更好地解释它吗?模式只是一个users表,其中包含一些关于用户的列。我只是随机选择了dti_id和用户名,因为它们的名称并不重要。只有表中需要匹配的其他特定列(一个是整数,另一个是文本)。而“表”应替换为我的表的名称?@DanGoodspeed。对你的问题不包括表的名称。我花了几个小时试图让它工作,当我在你写它时使用它时,它只是挂起。删除或停止挂起后的所有内容。我确实发现你在选择中漏掉了*号,你确定其他一切都是正确的吗?@DanGoodspeed。这个表有多大?大概有10000条左右。