sql - JOIN on DATEPART 月份和年份会导致额外的行

标签 sql postgresql join cartesian-product datepart

我有两个包含日期字段的表。这个日期字段是我想要实现的 JOIN 原因之一,但我只想在月份和年份上 JOIN,而不是在日期上。当我尝试这样做时,记录数大约增加了三倍。我猜我的查询有问题?或者这有可能吗?我正在使用 Postgres

SELECT a.load_date , a.mandt, a.vbeln,a.posnr, a.matnr, b.tfed
FROM tableA a
JOIN tableB b
ON date_part('month'::text, a.erdat) = date_part('month'::text, b.gdatu)
AND date_part('year'::text, a.erdat) = date_part('year'::text, b.gdatu)

编辑这是我的完整代码

 SELECT a.mandt, a.vbeln, 
   a.erdat, a.erzet, a.ernam, a.angdt, a.audat, a.vbtyp, a.trvog, 
   a.auart, a.submi, a.lifsk, a.faksk, a.netwr, a.waerk, a.vkorg, a.vtweg, a.spart, 
   a.vkgrp, a.vkbur, a.knumv, a.vdatu, a.vprgr, a.kalsm, a.vsbed, a.fkara, a.awahr, 
   a.bstnk, a.bstdk, a.telf1, a.kunnr, a.stafo, a.stwae, a.aedat, a.kvgr1,a.kvgr2, 
   a.kvgr3, a.kokrs, a.kkber, a.knkli, a.sbgrp, a.ctlpc, a.cmwae, a.cmfre, a.cmngv, 
   a.amtbl, a.hityp_pr, a.abrvw, a.vgbel, a.objnr, a.bukrs_vf, a.taxk1,a.xblnr, 
   a.vgtyp, a.abhod, a.abhov, a.stceg_l, a.landtx, a.fmbdat, a.vsnmr_v, a.handle, 
   a.yybcawv1, a.yybcawv2, a.yybcawv3, a.yyawv1dat, a.yyawv2dat, a.yybcawvc, 
   a.kvgr5, a.augru, a.autlf, a.bname, a.bnddt, a.bsark, a.cmnup, a.fiscalper,              
   a.fiscalyr, a.gwldt, a.ihrez, a.intind, a.intsum, a.rplnr, a.taxk2, a.yybabt, 
   a.yybemail, a.yybfax, a.yybname, a.yybphone, a.yyexporter, a.yypaypal_id, 
   a.yysd_projid, a.zone, a.zuonr, a.zz_campaign_id, a.zzedate, a.zzrev_cat_01, 
   a.zzrev_cat_02, a.zzrev_cat_03, a.zzrev_cat_04, a.zzrev_cat_05, a.zzrev_cat_06, 
   a.zzrev_cat_07, a.zzrev_cat_08, a.zzsdate, a.mahdt,
   CASE
        WHEN b.fcurr::text = 'USD'::text THEN a.netwr
        WHEN b.fcurr::text = 'JPY'::text AND b.kurst::text = 'M'::text THEN a.netwr * b.ukurs / 10::numeric
        WHEN b.fcurr::text = 'KRW'::text AND b.kurst::text = 'M'::text THEN a.netwr * b.ukurs / 10::numeric
        WHEN b.kurst::text = 'M'::text THEN a.netwr * b.ukurs
        ELSE a.netwr
    END AS net_value_trans_currency_netwr
FROM src.sap_vbak a
JOIN src.sap_tcurr b  
ON a.waerk::text = b.fcurr::text 
AND date_part('MONTH'::text, a.erdat::timestamp with time zone) = date_part('MONTH'::text, b.gdatu::timestamp with time zone)
AND date_part('YEAR'::text, a.erdat::timestamp with time zone) = date_part('YEAR'::text, b.gdatu::timestamp with time zone);

我正在尝试根据每个表中的日期(仅月份和年份)获取货币换算。有些货币换算是不同的(CASE语句中的net_value_trans_currency_netwr字段)。我希望 net_value_trans_currency_netwr 字段成为一个新行,以美元显示货币换算。原始表有超过 500 万行。连接之后,我最终得到了更多的行。根据我收集的信息,我正在完全加入。如果完全联接不创建超出所需的行,我将如何执行我正在尝试执行的操作?

最佳答案

当您对不唯一的月份和年份进行内连接时,您会得到重复的行。这会导致交叉连接,例如

Example Rows with dates
   Date          Month    Year
1  01/01/2014    01       14
2  02/01/2014    01       14

Result of above join has 4 rows not 2!
1) Month from (1) Year from (1)
2) Month from (1) Year from (2)
3) Month from (2) Year from (1)
4) Month from (2) Year from (2)

如果您想避免这种情况,您需要在连接中包含其他内容,以使每个连接都是唯一的!添加日期可能会有所帮助,但如果您在同一天记录了多个日期,您将得到重复的日期。考虑一下您还可以在连接中包含哪些内容。

关于sql - JOIN on DATEPART 月份和年份会导致额外的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22466661/

相关文章:

sql - 识别在时间范围内是否没有足够的资源

sql - PostgreSQL 函数中的 psql 变量是否有任何转义语法?

database - EXECUTE <query-string> USING value1... 在第一个替换占位符 ($1) 上阻塞

postgresql - bash脚本在docker容器中有一个postgres数据库

join - pyspark 左外连接多列

sql - 交叉连接同一表中的 N 组行

sql - SQL中如何根据范围对记录进行分组

sql - 无法在 oracle 中使用正则表达式 substr 获取模式的第二次出现

sql - MS Access - 使用带过滤器的 DSUM 进行带运行总计的子查询

mySQL JOIN 将文本添加到变量