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
我想加入 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