QUERY的最后一部分

时间:2017-10-31 19:45:19

标签: sql postgresql

我正在完成一个查询,但我无法完成它,表的结构如下:

孩子

CREATE TABLE CHILD(
child_id SMALLINT,
child_name VARCHAR(255) NOT NULL,
birth_date DATE NOT NULL,
gender VARCHAR(255) NOT NULL,
address VARCHAR(255),
city VARCHAR(255),
CONSTRAINT PK_CHILD PRIMARY KEY(child_id)

同级

CREATE TABLE SIBLING(
child_id1 SMALLINT,
child_id2 SMALLINT,
CONSTRAINT PK_SIBLING PRIMARY KEY(child_id1, child_id2),
CONSTRAINT CHILD1_FK FOREIGN KEY (child_id1) REFERENCES CHILD(child_id),
CONSTRAINT CHILD2_FK FOREIGN KEY (child_id2) REFERENCES CHILD(child_id)
);

字母

CREATE TABLE LETTER(
letter_id SMALLINT,
arrival_date DATE NOT NULL,
number_toys INTEGER NOT NULL,
delivery_mode VARCHAR(255) NOT NULL,
child_id SMALLINT,
CONSTRAINT PK_LETTER PRIMARY KEY(letter_id),
CONSTRAINT CHILD_FK FOREIGN KEY (child_id) REFERENCES CHILD(child_id)
);

wished_toy

 CREATE TABLE WISHED_TOY(
 letter_id SMALLINT,
 toy_id SMALLINT,
 CONSTRAINT PK_WISHED_TOY PRIMARY KEY(letter_id, toy_id),
 CONSTRAINT LETTER_FK FOREIGN KEY (letter_id) REFERENCES LETTER(letter_id)
 CONSTRAINT LETTER_FK FOREIGN KEY (toy_id) REFERENCES TOY(toy_id)
 );

玩具

CREATE TABLE TOY(
toy_id SMALLINT,
toy_name VARCHAR (255) NOT NULL,
price DECIMAL NOT NULL,
toy_type VARCHAR(255) NOT NULL,
manufacturer VARCHAR(255) NOT NULL,
CONSTRAINT PK_TOY PRIMARY KEY(toy_id),
);

他们要求我提出一个查询,其中包含要求他们的兄弟(兄弟姐妹)要求玩具的儿童名单。具体来说,子项的标识符是必需的child_id,名称为child_name,其出生日期为birth_date。

我已经有了这部分查询,但有些事情让我失望,我不知道如何比较每个孩子要求的玩具......

SELECT ch.child_id,ch.child_name,ch.birth_date,wi.toy_id
FROM child ch 
right outer join sibling si ON ch.child_id= SI.child_id1
left outer join letter l 
on ch.child_id=l.child_id
left outer join wished_toy wt on l.letter_id=wt.letter_id

这个查询给我回复了每个有兄弟和他哥哥要求的孩子的玩具。 我的问题是如何获得重复玩具的清单,我的意思是两兄弟问过。 兄弟夫妇是 child_id(1,11)(6,10)(3,12)(8,13)

查询的结果

1,    'Daniel'   ,'2005-05-01'   ,7
1,    'Daniel'   ,'2005-05-01'   ,5
1,    'Daniel'   ,'2005-05-01'   ,9
1,    'Daniel'   ,'2005-05-01'   ,4
1,    'Daniel'   ,'2005-05-01'   ,3
1,    'Daniel'   ,'2005-05-01'   ,1
11,   'Mireia'   ,'2009-06-10'   ,9
11,   'Mireia'   ,'2009-06-10'   ,7
11,   'Mireia'   ,'2009-06-10'   ,5
11,   'Mireia'   ,'2009-06-10'   ,4
11,   'Mireia'   ,'2009-06-10'   ,8
 6,    'Elena'   ,'2001-02-18'    ,5
10,   'Guillermo','2003-12-21'   ,1
10,   'Guillermo','2003-12-21'   ,4
10,   'Guillermo','2003-12-21'   ,9
 3,    'Raquel'  ,'2002-03-08'    ,5
 3,    'Raquel'  ,'2002-03-08'    ,2
12,   'Sergi'   ,'2012-08-29'   ,12
12,   'Sergi'   ,'2012-08-29'    ,7
12,   'Sergi'   ,'2012-08-29'    ,2
12,   'Sergi'   ,'2012-08-29'    ,5
8,    'Pedro'   ,'2008-03-30'    ,3
8,    'Pedro'   ,'2008-03-30'    ,4
8,    'Pedro'   ,'2008-03-30'    ,8
13,   'Sara'    ,'2002-08-29',  NULL

例如,可以看到兄弟1和11订购了相同的玩具,玩具9和7。 例如,我怎样才能得到它们中的两个?

1 个答案:

答案 0 :(得分:0)

BinarySearchTree
当单个孩子有多个字母时,

distinct是必要的,以防止重复的结果。身份证