Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何避免查询中的重复数据?_Sql_Postgresql_Left Join - Fatal编程技术网

Sql 如何避免查询中的重复数据?

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

创建返回动态结果的查询的最佳方法是什么?在我的postgresql中,我有三个表:

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') ;