【问题标题】:Find distinct values in SQL when subquery returns more than one row?当子查询返回多行时,在 SQL 中查找不同的值?
【发布时间】:2014-09-23 07:18:30
【问题描述】:

这些是我的桌子

表 1

  • 价格
  • city_category_id
  • city_product_id

这里是三行"

price | city_category_id | city_product_id
------+------------------+--------------------------
1500  | CHDELCLAPTOPDELL | CHDELCLAPTOPDELLVOSTR8
1200  | CHDELCLAPTOPDELL | CHDELCLAPTOPDELLVOSTR816
1000  | CHDELCLAPTOPDELL | CHDELCLAPTOPDELLVOSTR816

在这里我必须首先找到不同的产品名称,然后选择不同元素的最低价格。我希望输出为CHDELCLAPTOPDELLVOSTR816 and 1200 and CHDELCLAPTOPDELLVOSTR816 and 1000

查询

select min(price) 
from sellers_product 
where city_product_id=
(
   select distinct city_product_id 
   from sellers_product 
   where city_category_id='CHDELCLAPTOPDELL'
)

错误

我知道为什么会出现此错误,因为子查询返回的行超过 1 行,但有没有办法仅使用 1 个查询来获得所需的输出。

【问题讨论】:

  • city_product_id=更改为city_product_id IN (
  • 你的 rdbms 是什么? mysql还是sql server?
  • 为什么标签中同时包含mysql和mssql?
  • @Abhik 它只返回 1 个不同的价格和 city_product_id。我想要两个
  • 从子查询中删除然后

标签: mysql sql sql-server


【解决方案1】:

据我了解,您想要这样的东西:

DECLARE @sellers_product TABLE (price INT, Category_id VARCHAR(100), product_name VARCHAR(100))


INSERT INTO @sellers_product SELECT 1500, 'DELL', 'Vostro123'
INSERT INTO @sellers_product SELECT 1200, 'DELL', 'Vostro1234'
INSERT INTO @sellers_product SELECT 1000, 'DELL', 'Vostro123'



SELECT product_name, MIN(price) AS minPrice
FROM @sellers_product
WHERE Category_id = 'DELL'
GROUP BY product_name

结果:

product_name    minPrice
Vostro123       1000
Vostro1234      1200

此选择首先按Category_id 过滤您需要的行/类别,然后按“产品名称”分组以获得唯一名称。在这种情况下,我们将 2 行与“Vostro123”产品名称分组。从这个分组的行中,我们还可以获取MIN 价格值。

【讨论】:

  • 谢谢它的工作。只有最后一个问题你能解释一下这个查询是如何工作的。`SELECT product_name, MIN(price) AS minPrice FROM @sellers_product WHERE Category_id = 'DELL' GROUP BY product_name
  • 我将@Darka 解决方案更改为SQLITE,它给出了与他相同的答案,所以我给了他一个额外的分数。注意:不需要/使用 DISTINCT,只需要/使用一个 SELECT
【解决方案2】:

试试这个,让我知道它是否有效。如果您的子查询返回多于一行,那么您不能使用 =,因为它将返回单个值:

select distinct city_product_id,min(price),product_name from sellers_product 
    where city_category_id='CHDELCLAPTOPDELL'
 Group By product_name

【讨论】:

  • No ti 没用。这select min(price),city_product_id from sellers_product where city_product_id IN (select distinct city_product_id from sellers_product where city_category_id='CHDELCLAPTOPDELL') 只返回单行我想要两行具有不同 id 和这些不同 id 的最低价格
【解决方案3】:
;WITH CTE_RESULT AS 
(
    SELECT price, city_category_id, city_product_id, -- USE THE SELECT COLUMNS HERE
    ROW_NUMBER() OVER (PARTITION BY city_product_id --USE THE DISTINCT COLUMN HERE 
    ORDER BY price ASC -- CHANGE THE ORDER HERE) ROW_NO
    FROM #TABLE1
)

SELECT price, city_category_id, city_product_id FROM CTE_RESULT 
WHERE ROW_NO=1 -- FILTERS THE DUPLICATE ROWS

【讨论】:

    【解决方案4】:
    here is my answer using sqlite version 3 with your new data
    
    .mode column
    .separator ","
    .header ON
    .width 25 25
    
    DROP TABLE IF EXISTS sellers_product;
    
    CREATE TABLE sellers_product (
        price             INT,
        city_category_id  VARCHAR(100),
        city_product_id   VARCHAR(100));
    
    INSERT INTO sellers_product VALUES(1500, 'CHDELCLAPTOPDELL', 'CHDELCLAPTOPDELLVOSTR8');
    INSERT INTO sellers_product VALUES(1200, 'CHDELCLAPTOPDELL', 'CHDELCLAPTOPDELLVOSTR816');
    INSERT INTO sellers_product VALUES(1000, 'CHDELCLAPTOPDELL', 'CHDELCLAPTOPDELLVOSTR816');
    
    
    SELECT city_product_id, MIN(price) AS minPrice
        FROM  sellers_product
        WHERE city_category_id = 'CHDELCLAPTOPDELL'
        GROUP BY city_product_id;
    
    
    ------------- output -----------------
    
    city_product_id            minPrice
    -------------------------  -------------------------
    CHDELCLAPTOPDELLVOSTR8     1500
    CHDELCLAPTOPDELLVOSTR816   1000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多