sql 以键条件加入

sql join with condition on key

我想加入 table A 和 table B,如果您在 table B 中找到匹配项,则该匹配项必须满足条件。如果在 table B 中没有找到满足条件的匹配项,则用 NULL 值加入 table A。所以在结果中我应该有 table A 的所有记录,其中一些记录是从 B 加入的,还有一些 NULLes。 令我惊讶的是以下代码不起作用。 它 returns 的记录比它应该的多 - 不幸的是我不能 运行 它到最后,因为 table 太大了。日期的条件不起作用或键的条件定义不明确或者它使一些其他 JOIN 类型。

示例

A.Key | B.Key | B.Category
.....   .....   ..........
Johny | Johny | Pretty
Katte | Katte | Ugly 
Anne  | no match in Table B

预期结果:

A.Key | B.Category
.....   ..........
Johny | Pretty
Katte | NULL
Anne  | NULL

查询

DECLARE @date1 datetime
DECLARE @date2 datetime
SET @date1 = '2014-01-01T00:00:00.000'
SET @date2 = '2014-12-31T23:59:59.997'<br>
SELECT Key.A, B.[Category] 
FROM TableA as A
LEFT JOIN TableB as B
on A.[Key]=B.[Key] AND B.[Category]='Pretty' 
WHERE A.[Date] between @date1 and @date2

这是你想要的吗?

DECLARE @t1 TABLE(name NVARCHAR(MAX))
DECLARE @t2 TABLE(name NVARCHAR(MAX), cat NVARCHAR(MAX))


INSERT INTO @t1 VALUES('Johny')
INSERT INTO @t1 VALUES('Johny')
INSERT INTO @t1 VALUES('Katte')
INSERT INTO @t1 VALUES('Anne')


INSERT INTO @t2 VALUES('Johny', 'Ugly')
INSERT INTO @t2 VALUES('Johny', 'Pretty')
INSERT INTO @t2 VALUES('Katte', 'Ugly')

--Select N1

SELECT DISTINCT t1.name, t2.cat FROM @t1 as t1
LEFT JOIN @t2 as t2 on t1.name = t2.name AND t2.cat='Pretty'

--Select N2

    ;
WITH    cte
          AS ( SELECT   t1.name ,
                        t2.cat ,
                        ROW_NUMBER() OVER ( PARTITION BY t1.name ORDER BY t1.name ) AS rownum
               FROM     @t1 AS t1
                        LEFT JOIN @t2 AS t2 ON t1.name = t2.name
                                               AND t2.cat = 'Pretty'
             )
    SELECT  name, cat
    FROM    cte
    WHERE   rownum = 1

结果:

Anne    NULL
Johny   Pretty
Katte   NULL