Sql 如何避免查询中的重复数据?
创建返回动态结果的查询的最佳方法是什么?在我的postgresql中,我有三个表:Sql 如何避免查询中的重复数据?,sql,postgresql,left-join,Sql,Postgresql,Left Join,创建返回动态结果的查询的最佳方法是什么?在我的postgresql中,我有三个表: contacts |contact_emails| contact_numbers id | id | id descrip | id_contact | id_contact name | email | number 我想创建一个类似这样的结果: contact_name| contact_emailx| contact_numbersx co
contacts |contact_emails| contact_numbers
id | id | id
descrip | id_contact | id_contact
name | email | number
我想创建一个类似这样的结果:
contact_name| contact_emailx| contact_numbersx
contact_name |number1 | number2 |email
LA MEJOR | 25445877| 25845877 |AMEJOR@GMAIL.COM
这些x是可以联系的电子邮件和号码
我尝试使用左连接,这是我的代码:
SELECT c.id, c.contact_name, cn.number, ce.email
FROM contacts c
LEFT JOIN contact_numbers cn ON c.id = cn.contact_id
LEFT JOIN contact_emails ce ON c.id = ce.contact_id
WHERE c.user_id = 1
但它又回来了
我预计会出现以下情况:
contact_name| contact_emailx| contact_numbersx
contact_name |number1 | number2 |email
LA MEJOR | 25445877| 25845877 |AMEJOR@GMAIL.COM
或
谢谢你的帮助 您可以使用PostgreSQL将您的所有电子邮件和所有号码聚合到两个数组中:
。。。和数据
INSERT INTO
contacts
(id, user_id, descrip, contact_name)
VALUES
(2, 1, '', 'LA MEJOR'),
(3, 1, '', 'EDIFICADORA JUANA'),
(4, 1, '', 'EDIFICADORA JUANA'),
(5, 1, '', 'EDIFICADORA JUANA') ;
INSERT INTO
contact_emails
(contact_id, email)
VALUES
(2, 'AMEJOR@GMAIL.COM'),
(2, 'AHEJOR@GMAIL.COM'),
(3, 'oipoa@gmaio.com'),
(3, 'rst008@guan.com'),
(4, 'oipoa@gmaio.com'),
(4, 'rst008@guan.com'),
(5, 'oipoa@gmaio.com'),
(5, 'rst008@guan.com') ;
INSERT INTO
contact_numbers
(contact_id, number)
VALUES
(2, '25445877'),
(3, '24602254'),
(4, '24602254'),
(4, '55655545'),
(5, '24602254'),
(5, '55655545') ;
注意:根据图像上的数据推断,存在大量重复值。您的问题是什么?您是否引用了“联系人描述”列描述?在您的规范中,没有包含在您的SQL中,但在其他方面,您的输出与您想要的有什么不同?区别在于,例如,我只需要图像中的LA MEJOR,带有数字和电子邮件,没有两次,例如,我期望类似于:LA MEJOR,25445877,25845877, AMEJOR@GMAIL.COM@rd_nielsenJust或GROUP BYAs@joanolo说,您可以在查询中消除重复项,但您得到的是重复项,因为至少有一个表中存在相同联系人ID的重复行,不是因为有多个左连接。@rd_nielsen:我想每个联系人可以有几个电话和几个电子邮件…非常感谢@joanolo,一个关于数组的问题我可以分组更多的电子邮件和数字,多于两个吗?是的,根据需要,你可以计算email3,email4。。。根据需要,如果你想做一个相当于unpivot的,明白了!再次非常感谢!
SELECT
c.id, c.contact_name,
(SELECT array_agg(DISTINCT cn.number) FROM contact_numbers cn WHERE cn.contact_id = c.id) AS numbers,
(SELECT array_agg(DISTINCT ce.email) FROM contact_emails ce WHERE ce.contact_id = c.id) AS emails
FROM
contacts c
WHERE
c.user_id = 1
ORDER BY
c.id ;
id | contact_name | numbers | emails
-: | :---------------- | :------------------ | :----------------------------------
2 | LA MEJOR | {25445877} | {AHEJOR@GMAIL.COM,AMEJOR@GMAIL.COM}
3 | EDIFICADORA JUANA | {24602254} | {oipoa@gmaio.com,rst008@guan.com}
4 | EDIFICADORA JUANA | {24602254,55655545} | {oipoa@gmaio.com,rst008@guan.com}
5 | EDIFICADORA JUANA | {24602254,55655545} | {oipoa@gmaio.com,rst008@guan.com}
SELECT
id, contact_name,
numbers[1] AS number1,
numbers[2] AS number2,
emails[1] AS email1,
emails[2] AS email2
FROM
(
SELECT
c.id, c.contact_name,
(SELECT array_agg(DISTINCT cn.number) FROM contact_numbers cn WHERE cn.contact_id = c.id) AS numbers,
(SELECT array_agg(DISTINCT ce.email) FROM contact_emails ce WHERE ce.contact_id = c.id) AS emails
FROM
contacts c
WHERE
c.user_id = 1
) AS q
ORDER BY
id ;
id | contact_name | number1 | number2 | email1 | email2
-: | :---------------- | -------: | -------: | :--------------- | :---------------
2 | LA MEJOR | 25445877 | null | AHEJOR@GMAIL.COM | AMEJOR@GMAIL.COM
3 | EDIFICADORA JUANA | 24602254 | null | oipoa@gmaio.com | rst008@guan.com
4 | EDIFICADORA JUANA | 24602254 | 55655545 | oipoa@gmaio.com | rst008@guan.com
5 | EDIFICADORA JUANA | 24602254 | 55655545 | oipoa@gmaio.com | rst008@guan.com
CREATE TABLE contacts
(
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL /* REFERENCES users(id) */,
descrip text,
contact_name character varying(255)
) ;
CREATE TABLE contact_emails
(
contact_id INTEGER NOT NULL REFERENCES contacts(id),
email character varying(255) NOT NULL,
PRIMARY KEY(contact_id, email) -- This is the natural key for this table, no need for synthetic id
) ;
CREATE TABLE contact_numbers
(
contact_id INTEGER NOT NULL REFERENCES contacts(id),
number integer,
PRIMARY KEY(contact_id, number) -- Again...
) ;
INSERT INTO
contacts
(id, user_id, descrip, contact_name)
VALUES
(2, 1, '', 'LA MEJOR'),
(3, 1, '', 'EDIFICADORA JUANA'),
(4, 1, '', 'EDIFICADORA JUANA'),
(5, 1, '', 'EDIFICADORA JUANA') ;
INSERT INTO
contact_emails
(contact_id, email)
VALUES
(2, 'AMEJOR@GMAIL.COM'),
(2, 'AHEJOR@GMAIL.COM'),
(3, 'oipoa@gmaio.com'),
(3, 'rst008@guan.com'),
(4, 'oipoa@gmaio.com'),
(4, 'rst008@guan.com'),
(5, 'oipoa@gmaio.com'),
(5, 'rst008@guan.com') ;
INSERT INTO
contact_numbers
(contact_id, number)
VALUES
(2, '25445877'),
(3, '24602254'),
(4, '24602254'),
(4, '55655545'),
(5, '24602254'),
(5, '55655545') ;