0

基本上我有一个颜色表,现在我实现了一个将所有颜色匹配在一起的查询。我想知道是否可以通过循环来做到这一点?(也许它是一个嵌套循环)。

我的想法是将第一种颜色与其他颜色循环,然后将第二种颜色与其他颜色循环等等。非常感谢帮助

我的桌子- 包含不同的颜色

       CREATE TABLE Colors
      (c_ID VARCHAR2(3) NOT NULL,
      c_NAME VARCHAR2(11));

     INSERT INTO Colors VALUES
     ('T01','RED');
     INSERT INTO Colors VALUES
     ('T02','BLUE');
     INSERT INTO Colors VALUES
     ('T03','BLACK');
     INSERT INTO Colors VALUES
     ('T04','YELLOW');
     INSERT INTO Colors VALUES
     ('T05','ORANGE');

我用来匹配不同颜色sql查询:

         select  a.c_id as HM, s.c_id as AW
         from colors a, colors s
         where a.c_id <> s.c_id 
         order by a.c_id;
4

2 回答 2

1

如果我理解正确,您希望所有颜色都在单行中,甚至在单行的单列中?

您显示的查询只会产生成对的颜色。如果您想要所有颜色,则需要尽可能多地自行加入颜色。因此,添加或删除颜色会将您丑陋的查询变成损坏的查询。通常,您将获得一个查询结果,其中列数取决于颜色数。这不适用于关系范式。

如果您只想将所有颜色作为单个值,那么您需要聚合颜色。查询结果将是单个值,所有颜色组合在一起,可能用逗号分隔。

要聚合事物,您需要一个聚合函数。众所周知的聚合函数是 SUM、MIN 或 AVG,它们都不能满足您的需要。选择什么聚合函数取决于您的特定 SQL 方言。

对于 oracle,您可以查看pivot 或 xmlagg

您也可以考虑将整个事情包装在过程代码中。

于 2013-05-01T11:18:24.863 回答
1

递归查询。(这是针对 Postgres 的,您的语法可能会有所不同)

CREATE TABLE Colors
      (c_ID INTEGER NOT NULL
        , c_NAME VARCHAR
        );

     INSERT INTO Colors VALUES
     (1,'RED'), (2,'BLUE'), (3,'BLACK'), (4,'YELLOW'), (5,'ORANGE');

WITH RECURSIVE xxx AS (
        SELECT
        c1.c_ID AS last_id
        , c1.c_NAME::text AS all_colors
        FROM Colors c1
        UNION ALL
        SELECT c2.c_ID AS last_id
                , x.all_colors|| '+' || c2.c_NAME::text AS all_colors
        FROM Colors c2
        JOIN xxx x ON x.last_id < c2.c_ID
        )
SELECT all_colors
FROM xxx
        ;

结果:

CREATE TABLE
INSERT 0 5
          all_colors          
------------------------------
 RED
 BLUE
 BLACK
 YELLOW
 ORANGE
 RED+BLUE
 RED+BLACK
 RED+YELLOW
 RED+ORANGE
 BLUE+BLACK
 BLUE+YELLOW
 BLUE+ORANGE
 BLACK+YELLOW
 BLACK+ORANGE
 YELLOW+ORANGE
 RED+BLUE+BLACK
 RED+BLUE+YELLOW
 RED+BLUE+ORANGE
 RED+BLACK+YELLOW
 RED+BLACK+ORANGE
 RED+YELLOW+ORANGE
 BLUE+BLACK+YELLOW
 BLUE+BLACK+ORANGE
 BLUE+YELLOW+ORANGE
 BLACK+YELLOW+ORANGE
 RED+BLUE+BLACK+YELLOW
 RED+BLUE+BLACK+ORANGE
 RED+BLUE+YELLOW+ORANGE
 RED+BLACK+YELLOW+ORANGE
 BLUE+BLACK+YELLOW+ORANGE
 RED+BLUE+BLACK+YELLOW+ORANGE
(31 rows)
于 2013-05-01T11:39:41.557 回答