PostgreSQL:返回所有行,包括重复行

时间:2014-12-19 20:00:18

标签: postgresql web duplicates

一些背景知识:我的客户要求找出谁在使用他的电脑。每个计算机用户都有一个附加在其帐户中的唯一条形码,最终存储在日志文件中(记录日期和时间等),但他查看的日志文件不报告他需要的这些用户的住所。我有一个单独的只读PostgreSQL数据库,我可以搜索以查找用户使用条形码的住所。我使用textarea字段设置Web表单,以允许客户端输入条形码列表。然后,我将整个字符串捕获到一个变量中,并将一个如下所示的SQL查询放在一起:

SELECT

n.last_name as name,
p.barcode as barcode, 
p.home as residence 

FROM db.pt_view p JOIN db.pt_record_fullname n ON p.id = n.patron_record_id 

WHERE p.barcode IN ('25260045344400','25233423433332','25233423433332','...)

这样可行,但“IN”运算符当然会删除所有重复的条形码。我需要所有条形码(重复或不重复)以匹配日志文件中的条目数。条形码可以在日志中的不同日期和时间出现多次。使用上面的查询,我输入了918个条形码,只返回了450.

我是一个相对的PostgreSQL和数据库noob,所以我确信有更好的方法来处理它并返回所有记录(带有重复项)。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试笛卡儿产品

如果您在没有ON的情况下使用JOIN,将创建一个笛卡尔积,这是一个产品ALL x ALL行并使用一个condicional来结束。

有些想法:

SELECT

n.last_name as name,
p.barcode as barcode, 
p.home as residence 

FROM db.pt_view p JOIN db.pt_record_fullname n 

WHERE p.barcode IN ('25260045344400','25233423433332','25233423433332','...) and p.id = n.patron_record_id
PD:我的英语不好xD

答案 1 :(得分:0)

如果IN没有按照您的意愿行事,那么VALUES作为子查询的即时功能可能就行了。

SELECT
n.last_name as name, /* don't recommend using reserved word name this way */
p.barcode as barcode, 
p.home as residence 

FROM db.pt_view p
JOIN db.pt_record_fullname n ON p.id = n.patron_record_id 
JOIN (VALUES('25260045344400'),('25233423433332'),('25233423433332') /* , ...*/))
         AS codes(barcode)
     ON p.barcode=codes.barcode;