基本上我有一张颜色表,现在我实现了一个匹配所有颜色的查询。我想知道是否可以通过循环执行此操作? (也许它是一个嵌套循环)。
我的想法是将第一种颜色与其他颜色一起循环,然后将第二种颜色与其他颜色循环等。非常感谢帮助。
我的表格 - 包含不同的颜色
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;
答案 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)