如何使用 where/have 子句选择唯一行并与另一个表进行比较

Posted

技术标签:

【中文标题】如何使用 where/have 子句选择唯一行并与另一个表进行比较【英文标题】:how can select unique row using where/having cluse and compare with another table 【发布时间】:2016-06-22 20:44:07 【问题描述】:

我无法理解如何从表中获取唯一列(删除重复项) 与另一个表数据进行比较。

就我而言

我有两张桌子

在使用 tblviewer 编译后,我想从 tblproduct 中获取唯一的行 [在表查看器中首先获取viewerid,然后在查看器表中获取productid,然后与tblproduct进行编译。

其实是这样的

如果我取 vieweris=123 两行 productid 选择 12001&11001 之后,此 tblproduct productid 并最终从 tblproduct which macing 中取行。

select   * 
from     tblproduct 
where    productid = 
(
    select distinct(productid) 
    from   tblviewer 
    where  viewerid = 123
)

【问题讨论】:

您是否尝试过使用select distinct 您的预期结果是什么? 将您的 = 更改为 in 【参考方案1】:

有几种方法可以做到这一点。您可以对表格执行标准INNER JOIN 以过滤结果:

Select  Distinct P.*
From    tblProduct  P
Join    tblViewer   V   On  V.ProductId = P.ProductId
Where   V.ViewerId = 123

或者,您也可以使用EXISTS - 这样就无需完全使用DISTINCT

Select  *
From    tblProduct  P
Where Exists
(
    Select  *
    From    tblViewer   V
    Where   V.ProductId = P.ProductId
    And     V.ViewerId = 123
)

或者,您也可以按照其他答案的建议使用IN

Select  * 
From    tblProduct 
Where   ProductId In 
(
    Select  ProductId
    From    tblViewer 
    Where   ViewerId = 123
)

【讨论】:

从性能的角度来看,这个解决方案比其他答案有更好的性能 不错的答案@siyual【参考方案2】:

我认为你只想使用 IN 子句,你不需要使用 distinct

select   *
from     tblproduct 
where    productid in
(
    select productid 
    from   tblviewer 
    where  viewerid = 123
)

【讨论】:

【参考方案3】:

我不确定你在问什么,但我认为是的,

select   * 
from     tblproduct 
where    productid in
(
    select distinct(productid) 
    from   tblviewer 
)

【讨论】:

以上是关于如何使用 where/have 子句选择唯一行并与另一个表进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何删除唯一行并保持重复? SQL

T-SQL 过于昂贵的查询,在 where/have 条件和复合主键中选择

在 thymeleaf 中添加和删除具有多个元素的动态行并与列表绑定

Python:如何按一列分组行并按另一列选择一行?

Oracle:尝试使用唯一键组合的“更新”语句。卡在 where 子句中

Where子句选择多行唯一值