2

首先,这个问题的标题很可怕,但我没有找到更好的方式来描述我的问题。

可能有一个非常简单的方法可以做到这一点,但我无法弄清楚。这与这个问题非常相似,但我在 sqlite3 (iOS) 上运行,所以我怀疑我的选择要有限得多。

我有一张包含产品记录的表格。所有记录都有一个 ID(注意:我说的不是行 ID,而是每个产品唯一的标识号)。某些产品可能在表中有两个条目(都具有相同的 ID)。唯一的区别是在一个特殊的列中(假设列 COLOR 可以是 RED 或 GREEN)。

我想做的是根据颜色的值创建一个唯一产品列表,如果同一产品同时存在绿色和红色记录,则优先考虑绿色。

简而言之,如果我有以下情况:

id       PRODUCT ID    COLOUR
1        1001          GREEN
2        1002          GREEN
3        1002          RED
4        1003          RED

我希望我的 SELECT 返回第 1、2 和 4 行。我怎样才能做到这一点?

我目前的方法是有单独的表,并手动进行连接,但显然这是一个非常糟糕的主意..

注意:我尝试从这里使用相同的方法:

SELECT * 
  FROM xx
 WHERE f_COLOUR = "GREEN"
UNION ALL
SELECT * 
  FROM xx 
 WHERE id not in (SELECT distinct id 
                    FROM xx 
                   WHERE f_COLOUR = "GREEN");

但我得到的结果是第 1、2、3、4 行,而不仅仅是 1、2、4。我错过了什么?

编辑:请再问一个问题:如何使这与记录的子集一起使用,即。如果我想过滤一些记录而不是整个表?

例如,如果我有类似 SELECT * FROM table WHERE productID LIKE "1%" 之类的东西......我如何检索每个独特的产品,但仍然尊重颜色优先级(绿色>红色)?

4

4 回答 4

5

您的查询几乎是正确的。只是使用PRODUCTID而不是ID.

SELECT * 
FROM xx
WHERE f_COLOUR = "GREEN"
UNION
SELECT * 
FROM xx 
WHERE PRODUCTID not in 
                (SELECT PRODUCTID
                 FROM xx 
                 WHERE f_COLOUR = "GREEN");

SQLFiddle 演示

于 2012-08-11T09:50:57.800 回答
2

尝试这个

SELECT * 
FROM xx
WHERE COLOUR = 'GREEN'
UNION
SELECT * 
FROM xx WHERE P_Id not in 
                (SELECT P_Id
                 FROM Persons 
                 WHERE COLOUR = 'GREEN');

另见 SQL FIDDLE 演示

于 2012-08-11T10:03:08.003 回答
0

我只想提供您可以通过以下方式与组一起执行此操作:

select (case when sum(case when colour = 'Green' then 1 else 0 end) > 0
             then max(case when colour = 'Green' then id end)
             else max(case when colour = 'Red' then id end)
        end) as id,
       product_id
       (case when sum(case when colour = 'Green' then 1 else 0 end) > 0 then 'Green'
             else 'Red'
        end) as colour
from t
group by product_id
于 2012-08-11T15:37:23.550 回答
0

You can have it like this

WITH PriorityTable
AS
(
    SELECT T.*,
        ROW_NUMBER() OVER (PARTITION BY T.ID
                            ORDER BY PT.ColorPriority )  PriorityColumn
    FROM XX AS T
    INNER JOIN (
        SELECT 'RED' AS f_COLOUR , 1 AS ColorPriority
        UNION
        SELECT 'GREEN' AS f_COLOUR , 2 AS ColorPriority
    ) AS PT
        ON T.f_COLOUR  = PT.f_COLOUR 
)

SELECT * FROM PriorityTable
WHERE PriorityColumn = 1
于 2015-08-13T06:45:21.250 回答