SQL:如何根据某些属性值仅选择不同的行

SQL:如何根据某些属性值仅选择不同的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的数据库中有一个sql视图,它使用一个并集来表示不同的结果(一边包含一个左连接,而另一边使用NULL作为缺少值的占位符)。在联接的一部分中,一个属性(外键)为null,而在另一部分中,它包含一个值(用于相同的唯一ID)。因此,我的联接将生成如下结果集: ID | ForeignKey 1 NULL 1 123 2 NULL 3 NULL 4 NULL 4 234

我的数据库中有一个sql视图,它使用一个并集来表示不同的结果(一边包含一个左连接,而另一边使用NULL作为缺少值的占位符)。在联接的一部分中,一个属性(外键)为null,而在另一部分中,它包含一个值(用于相同的唯一ID)。因此,我的联接将生成如下结果集:

ID     |    ForeignKey
1           NULL
1           123
2           NULL
3           NULL
4           NULL
4           234
ID     |    ForeignKey
1           NULL
2           NULL
3           NULL
4           NULL
我试图减少这个结果集,使其只包含具有唯一ID的条目,但我无法检查ForeignKey是否为NULL,因为这样我会过滤掉键为NULL的所有其他行

我要寻找的是一种方法,告诉SQL检查整个结果集是否使用了相同的ID两次。如果它发现这样一个重复项(如上面ID为1和4的条目),它应该只显示具有值(123和234)的条目。应过滤掉带有NULL的条目

如果未发现重复项(如ID 2和3),则应使用该条目

因此,我想将上述结果集转换为:

ID     |    ForeignKey
1           123
2           NULL
3           NULL
4           234
我试图通过使用OVER关键字和partitionbyid来解决这个问题,其中我将RowNumber设置为等于1。这会过滤掉重复的条目,但它总是选择带有NULL的条目,而不是带有实际键的条目,因此错误的结果如下所示:

ID     |    ForeignKey
1           NULL
1           123
2           NULL
3           NULL
4           NULL
4           234
ID     |    ForeignKey
1           NULL
2           NULL
3           NULL
4           NULL

如果您还包括ForeignKey描述的订单,则使用OVER(PARTITION BY)的解决方案将有效。如果您还包括ForeignKey描述的订单,则使用OVER(PARTITION BY)的解决方案将有效。谢谢!它起作用了!唯一的问题是我现在必须手动指定每一列。否则会出现一个错误,无法选择xyz列,因为它不在Group By子句的聚合中…谢谢!它起作用了!唯一的问题是我现在必须手动指定每一列。否则,将出现一个错误,无法选择xyz列,因为它不在Group By子句的聚合中。。。