简体   繁体   English

SQL Server内部联接在具有where条件的多列上

[英]SQL server inner join on multiple columns with where condition

I have the query below where I am try to compare two tables. 我在下面的查询中尝试比较两个表。 I can see the two tables do have matching rows but the query below does not return any rows. 我可以看到两个表确实有匹配的行,但是下面的查询没有返回任何行。 I have followed the examples from similar questions but I cannot get the query to work - not sure what I am missing? 我遵循了类似问题的示例,但是我无法使查询正常工作-不确定我缺少什么吗? I did read about using the a union query to compare two tables, would that be better? 我确实读过有关使用联合查询比较两个表的信息,这样会更好吗?

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'

EDIT 编辑

Please see the data the return should be returning. 请查看退货应返回的数据。 I have changed the fund & ID columns, however the columns are strings. 我已经更改了资金和ID列,但是这些列是字符串。 So what I would like my query to do is show me where any rows are not exactly the same. 因此,我希望查询执行的操作是向我显示任何行都不完全相同的位置。 For example the second row in Table B has a nominal which is different to Table A. The prices in table B are also different to column A. 例如,表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

Latest query attempt 最新查询尝试

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
    )

Two observations (too long for a comment). 两种观察(对于评论来说太长了)。

First off, don't you mean your third join to be 首先,你不是说你的第三次加入

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

Also, you're now joining the same table ( HOLDINGS_LIVE ) thrice . 另外,您现在要加入三次相同的表( HOLDINGS_LIVE )。 Could you possibly have meant to join it on three conditions? 您是否可以在三个条件下加入它?

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'

Lastly, what happens if you drop the where-clause? 最后,如果删除子句会怎样? Is the date format you use correct? 您使用的日期格式正确吗? If the field is of a date datatype , I advise you to use explicit conversion instead of relying on implicit conversion. 如果该字段是日期数据类型 ,则建议您使用显式转换,而不要依赖隐式转换。

you can use except: 您可以使用以下除外:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM