我正在 PostgreSQL 中的两个表之间进行连接,一个表对事件编号 (opentickets) 有主键约束,而另一个表没有约束并且可以有重复的事件编号 (incommingtickets)。尝试过滤掉重复项时会出现问题。查询,
SELECT incommingtickets.*
FROM incommingtickets
LEFT JOIN opentickets
ON incommingtickets.incidentnumber = opentickets.incidentnumber
WHERE opentickets.incidentnumber IS NULL
AND incommingtickets.status NOT IN ('Closed','Cancelled', '')
一直工作到遇到重复项为止,我收到违反主键的消息。如果我添加一个不同的子句,例如,
SELECT DISTINCT ON (incommingtickets.incidentnumber) incommingtickets.*
FROM incommingtickets
LEFT JOIN opentickets
ON incommingtickets.incidentnumber = opentickets.incidentnumber
WHERE opentickets.incidentnumber IS NULL
AND incommingtickets.status NOT IN ('Closed','Cancelled', '')
我得到一个错误,
pg_query(): Query failed: ERROR: missing FROM-clause entry for table "incommingtickets" LINE 30: WHERE opentickets.incidentnumber = incommingtickets.incident...
最佳答案
使用 WHERE 子句过滤掉不需要的重复项,尽管我不太清楚为什么要加入“指标”(例如门票数量)。
SELECT incommingtickets.*
FROM incommingtickets
WHERE incommingtickets.incidentnumber not in (
select
distinct
incidentnumber
FROM opentickets)
AND incommingtickets.status NOT IN ('Closed','Cancelled', '')
通过这种方式,您可以过滤掉两个表之间的重复项。
如果您想要检查或更新 opentickets
表中任何门票的门票状态,请尝试从 incommingtickets
中获取最大状态,如下所示:
WITH ticket_rows AS(
SELECT
rank() OVER (PARTITION BY ticket_id ORDER BY ticket_timestamp desc) as row_number,
ticket_id,
ticket_status,
ticket_timestamp
from incommingtickets
)
SELECT incommingtickets.*, opentickets_2.*
FROM opentickets o
LEFT JOIN ticket_rows ON ticket_rows.ticket_id= opentickets.ticket_id AND ticket_rows.row__number=1
如果这些不是您的目标,请更好地解释您试图通过左连接实现的目标。
关于PostgreSQL 加入不同的子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197432/