嵌套循环以匹配颜色

时间:2013-05-01 10:59:29

标签: sql nested-loops

基本上我有一张颜色表,现在我实现了一个匹配所有颜色的查询。我想知道是否可以通过循环执行此操作? (也许它是一个嵌套循环)。

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

我的表格 - 包含不同的颜色

       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;

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要一行中的所有颜色,甚至是单行的一列?

您显示的查询只会产生颜色。如果你想要所有颜色,你需要自己加入你有颜色的次数。因此,添加或删除颜色会将丑陋的查询变为破坏的查询。通常,您将获得一个查询结果,其中列数取决于颜色数。这与关系范式不相符。

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

要聚合您需要聚合函数的内容。众所周知的聚合函数是SUM,MIN或AVG,这些都不是你需要的。选择哪个聚合函数取决于您的特定SQL方言。

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

您也可以考虑在程序代码中包装整个内容。

答案 1 :(得分: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)