SQL服务器内连接在多个列上的where条件

时间:2014-03-07 08:20:07

标签: sql sql-server

我有下面的查询,我试图比较两个表。我可以看到这两个表确实有匹配的行,但下面的查询不会返回任何行。我已经按照类似问题的示例进行了操作,但我无法使查询工作 - 不确定我缺少什么?我确实读过关于使用union查询来比较两个表,那会更好吗?

SELECT H.[FUND_CD], H.[SEDOLCHK], H.[CURR]
FROM 
    HOLDINGS H
INNER JOIN 
    HOLDINGS_LIVE HL1 ON H.FUND_CD = HL1.FUND_CD
INNER JOIN 
    HOLDINGS_LIVE HL2 ON H.SEDOLCHK = HL2.SEDOLCHK
INNER JOIN 
    HOLDINGS_LIVE HL3 ON H.SEDOLCHK = HL3.CURR
WHERE 
    H.DATEU = '2014-03-06' AND HL1.DATEU = '2014-03-06'

修改

请查看返回的数据。我已经改变了基金和ID列,但列是字符串。所以我想让我的查询做的是告诉我哪里的行不完全相同。例如,表B中的第二行的标称值与表A不同。表B中的价格也与A列不同。

Table A                 
Fund    ID  Nominal Currency    Price   Date Stamp
ABC 12345   34102   GBP 1257    06-03-2014 00:00:00
ABC 45678   14884   EUR 13.085  06-03-2014 00:00:00
ABC 32564   2404    EUR 65.97   06-03-2014 00:00:00
ABC 95874   13515   CHF 87  06-03-2014 00:00:00
ABC 96325   803201  GBP 247.3   06-03-2014 00:00:00
ABC 15648   39442   DKK 256.7   06-03-2014 00:00:00
DEF 78451   1761    USD 372.16  06-03-2014 00:00:00
DEF 48884   22936   USD 13.99   06-03-2014 00:00:00
DEF 33215   2288    USD 41.1    06-03-2014 00:00:00
DEF 68745   801 CAD 86.16   06-03-2014 00:00:00

Table B                 
Fund    ID  Nominal Currency    Price   Date Stamp
ABC 12345   34102   GBP 12.57   06-03-2014 00:00:00
ABC 45678   14800   EUR 0.13085 06-03-2014 00:00:00
ABC 32564   2404    EUR 0.6597  06-03-2014 00:00:00
ABC 95874   13515   CHF 0.87    06-03-2014 00:00:00
ABC 96325   803201  GBP 2.473   06-03-2014 00:00:00
ABC 15648   39442   DKK 2.567   06-03-2014 00:00:00
DEF 78451   1761    USD 3.7216  06-03-2014 00:00:00
DEF 48884   22936   USD 0.1399  06-03-2014 00:00:00  
DEF 33215   2288    USD 0.411   06-03-2014 00:00:00
DEF 68745   801 CAD 0.8616  06-03-2014 00:00:00

最新查询尝试

SELECT H.[FUND_CD], H.[SEDOLCHK], H.[CURR]
FROM 
    HOLDINGS H
INNER JOIN 
    HOLDINGS_LIVE HL 
    ON 
    ( 
        H.FUND_CD = HL.FUND_CD
        AND H.SEDOLCHK = HL.SEDOLCHK
        AND H.CURR = HL.CURR
    )

2 个答案:

答案 0 :(得分:1)

两个观察结果(评论时间太长)。

首先,你不是指你的第三次加入

INNER JOIN HOLDINGS_LIVE HL3 ON H.CURR = HL3.CURR

此外,您现在正在加入同一个表格(HOLDINGS_LIVE三次。你有没有打算加入三个条件?

SELECT H.[FUND_CD], H.[SEDOLCHK], H.[CURR]
FROM HOLDINGS H
INNER JOIN HOLDINGS_LIVE HL 
   ON (   H.FUND_CD = HL.FUND_CD 
      AND H.SEDOLCHK = HL.SEDOLCHK 
      AND H.CURR = HL.CURR
   )
WHERE H.DATEU = '2014-03-06' AND HL.DATEU = '2014-03-06'

最后,如果删除where子句会发生什么?您使用的日期格式是否正确?如果该字段的日期为数据类型,我建议您使用显式转换,而不是依赖隐式转换。

答案 1 :(得分:0)

你可以使用除了:

SELECT H.[FUND_CD], H.[SEDOLCHK], H.[CURR]FROM HOLDINGS H
except 
SELECT H.[FUND_CD], H1.[SEDOLCHK], H.[CURR]FROM HOLDINGS_LIVE H