2

まず第一に、この質問のタイトルはひどいですが、私は自分の問題を説明するためのより良い方法を見つけられませんでした。

これを行うにはおそらく非常に簡単な方法がありますが、私はそれを理解できませんでした。これはこの質問に非常に似ていますが、私はsqlite3(iOS)で実行しているので、オプションがはるかに制限されていると思います。

製品レコードのテーブルがあります。すべてのレコードにはIDがあります(注:行IDについてではなく、各製品に固有の識別番号について説明しています)。一部の製品では、テーブルに2つのエントリがあります(両方とも同じIDです)。唯一の違いは、特別な列にあります(たとえば、列のCOLORはREDまたはGREENのいずれかになります)。

私がやりたいのは、COLOURの値に基づいて一意の製品のリストを作成することです。同じ製品に、GREENレコードと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、4だけではなく、1、2、3、4行です。私は何が欠けていますか?

編集:もう1つ質問してください:これをレコードのサブセットで機能させるにはどうすればよいですか?テーブル全体ではなく、一部のレコードをフィルタリングしたい場合はどうすればよいですか?

たとえば、SELECT * FROM table WHERE productID LIKE "1%"のようなものがある場合、色の優先度(GREEN> RED)を尊重しながら、各一意の製品を取得するにはどうすればよいですか?

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');

SQLFIDDLEDEMOも参照してください

于 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

あなたはそれをこのようにすることができます

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 に答える