SQL Server 2005 - 合并两个数据集,但即使不匹配也输出一行
SQL Server 2005 - Combine two datasets, but output a row even on non-matching
我想请教一下这个问题的专业知识。
基本上我需要在匹配字段上合并两个数据集,但是,在 table1 中没有匹配记录与 table2 的情况下,输出 table 必须包含一个投票字段中的值,表示没有错过,值为 0。
这个适用的场景,是一个投票系统。三 table 选举、候选人和投票。
最后的输出table必须输出ELECTIONStable中有CANDIDATE的所有位置。然而,在一个职位的所有候选人的 VOTES table 中可能没有任何投票给他们。输出仍然必须 return 位置,并且 0 反对投票。到目前为止,我的代码是这样的。
CREATE TABLE #MYELECTIONS (E_POSITION_CODE INT, E_POSITIONNAME VARCHAR(50))
INSERT INTO #MYELECTIONS VALUES (147,'Manager')
INSERT INTO #MYELECTIONS VALUES (148,'Supervisor')
INSERT INTO #MYELECTIONS VALUES (149,'Counciler')
CREATE TABLE #MYCANDIDATES (C_CANDIDATE_CODE INT, C_CANDIDATENAME VARCHAR (50), C_POSITION_CODE INT)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 147)
INSERT INTO #MYCANDIDATES VALUES (101,'Micky Mouse', 147)
INSERT INTO #MYCANDIDATES VALUES (103,'Donald Duck', 147)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 148)
CREATE TABLE #MYVOTES (V_POSITION_CODE INT, V_CANDIDATE_CODE INT, V_VOTER VARCHAR(8), V_VOTINGPREFERENCE SMALLINT)
INSERT INTO #MYVOTES VALUES (147,100,'11111111',1)
INSERT INTO #MYVOTES VALUES (147,101,'11111111',2)
INSERT INTO #MYVOTES VALUES (147,103,'11111111',3)
INSERT INTO #MYVOTES VALUES (147,100,'22222222',1)
INSERT INTO #MYVOTES VALUES (147,100,'33333333',1)
INSERT INTO #MYVOTES VALUES (147,100,'44444444',1)
INSERT INTO #MYVOTES VALUES (147,101,'55555555',2)
INSERT INTO #MYVOTES VALUES (147,101,'66666666',1)
INSERT INTO #MYVOTES VALUES (147,103,'77777777',1)
INSERT INTO #MYVOTES VALUES (148,100,'88888888',1)
INSERT INTO #MYVOTES VALUES (148,100,'99999999',2)
DECLARE @MyPositionCode AS INT
SET @MyPositionCode = 147
------------------------------------------------------------------------------------
DECLARE @TEMPTABLE1 TABLE (T1_POSITIONCODE VARCHAR(3), T1_POSITIONNAME VARCHAR(255),
T1_CANDIDATECODE VARCHAR(8),T1_CANDIDATENAME VARCHAR(255))
INSERT INTO @TEMPTABLE1
SELECT
E_POSITION_CODE,
E_POSITIONNAME,
C_CANDIDATE_CODE,
C_CANDIDATENAME
FROM #MYELECTIONS
INNER JOIN #MYCANDIDATES ON
E_POSITION_CODE = C_POSITION_CODE
WHERE #MYELECTIONS.E_POSITION_CODE = @MYPOSITIONCODE
SELECT * FROM @TEMPTABLE1
-----------------------------------------------------------------------------------
DECLARE @TEMPTABLE2 TABLE (T2_POSITIONCODE VARCHAR(3), T2_CANDIDATECODE VARCHAR(8),
T2_VOTE SMALLINT, T2_VOTER VARCHAR(8))
INSERT INTO @TEMPTABLE2
SELECT
V_POSITION_CODE,
V_CANDIDATE_CODE,
ISNULL(V_VOTINGPREFERENCE,0) AS 'VOTES',
V_VOTER
FROM #MYVOTES
LEFT OUTER JOIN @TEMPTABLE1 ON
T1_POSITIONCODE = V_POSITION_CODE AND
T1_CANDIDATECODE = V_CANDIDATE_CODE
SELECT * FROM @TEMPTABLE2
最终输出应该是这样的:
T1_POSITION_CODE T1_POSITIONNAME T1_CANDIDATECODE T1_CANDIDATENAME T2_VOTER T2_VOTE
147 Manager 100 Tom Cruise 11111111 1
147 Manager 101 Micky Mouse 11111111 2
147 Manager 103 Donald Duck 11111111 3
147 Manager 100 Tom Cruise 22222222 1
147 Manager 101 Micky Mouse 22222222 0
147 Manager 103 Donald Duck 22222222 0
147 Manager 100 Tom Cruise 33333333 1
147 Manager 101 Micky Mouse 33333333 0
147 Manager 103 Donald Duck 33333333 0
147 Manager 100 Tom Cruise 44444444 1
147 Manager 101 Micky Mouse 44444444 0
147 Manager 103 Donald Duck 44444444 0
147 Manager 100 Tom Cruise 55555555 0
147 Manager 101 Micky Mouse 55555555 2
147 Manager 103 Donald Duck 55555555 0
147 Manager 100 Tom Cruise 66666666 1
147 Manager 101 Micky Mouse 66666666 0
147 Manager 103 Donald Duck 66666666 0
147 Manager 100 Tom Cruise 77777777 0
147 Manager 101 Micky Mouse 77777777 0
147 Manager 103 Donald Duck 77777777 1
147 Manager 100 Tom Cruise 88888888 1
147 Manager 101 Micky Mouse 88888888 0
147 Manager 103 Donald Duck 88888888 0
147 Manager 100 Tom Cruise 99999999 2
147 Manager 101 Micky Mouse 99999999 0
147 Manager 103 Donald Duck 99999999 0
因此,我们可以看到 0 被 return 反对投票列中的职位,有候选人,即使选民没有投票给他们。
提前致谢。
我不知道为什么147, 100, Tom Cruise, 99999999
在这里是2
。我觉得应该是0
。这适用于最后几位选民。
试试这样的东西:
CREATE TABLE #MYELECTIONS (E_POSITION_CODE INT, E_POSITIONNAME VARCHAR(50))
INSERT INTO #MYELECTIONS VALUES (147,'Manager')
INSERT INTO #MYELECTIONS VALUES (148,'Supervisor')
INSERT INTO #MYELECTIONS VALUES (149,'Counciler')
CREATE TABLE #MYCANDIDATES (C_CANDIDATE_CODE INT, C_CANDIDATENAME VARCHAR (50), C_POSITION_CODE INT)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 147)
INSERT INTO #MYCANDIDATES VALUES (101,'Micky Mouse', 147)
INSERT INTO #MYCANDIDATES VALUES (103,'Donald Duck', 147)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 148)
CREATE TABLE #MYVOTES (V_POSITION_CODE INT, V_CANDIDATE_CODE INT, V_VOTER VARCHAR(8), V_VOTINGPREFERENCE SMALLINT)
INSERT INTO #MYVOTES VALUES (147,100,'11111111',1)
INSERT INTO #MYVOTES VALUES (147,101,'11111111',2)
INSERT INTO #MYVOTES VALUES (147,103,'11111111',3)
INSERT INTO #MYVOTES VALUES (147,100,'22222222',1)
INSERT INTO #MYVOTES VALUES (147,100,'33333333',1)
INSERT INTO #MYVOTES VALUES (147,100,'44444444',1)
INSERT INTO #MYVOTES VALUES (147,101,'55555555',2)
INSERT INTO #MYVOTES VALUES (147,101,'66666666',1)
INSERT INTO #MYVOTES VALUES (147,103,'77777777',1)
INSERT INTO #MYVOTES VALUES (148,100,'88888888',1)
INSERT INTO #MYVOTES VALUES (148,100,'99999999',2)
DECLARE @MyPositionCode AS INT = 147
SELECT me.E_POSITION_CODE ,
me.E_POSITIONNAME ,
mc.C_CANDIDATE_CODE ,
mc.C_CANDIDATENAME ,
c.V_VOTER ,
ISNULL(mv.V_VOTINGPREFERENCE, 0) AS V_VOTINGPREFERENCE
FROM #MYCANDIDATES mc
JOIN #MYELECTIONS me ON mc.C_POSITION_CODE = me.E_POSITION_CODE
CROSS JOIN ( SELECT DISTINCT
V_VOTER
FROM #MYVOTES
) c
LEFT JOIN #MYVOTES mv ON mc.C_POSITION_CODE = mv.V_POSITION_CODE
AND mc.C_CANDIDATE_CODE = mv.V_CANDIDATE_CODE
AND c.V_VOTER = mv.V_VOTER
WHERE mc.C_POSITION_CODE = @MyPositionCode
ORDER BY c.V_VOTER , C_CANDIDATE_CODE
DROP TABLE #MYCANDIDATES
DROP TABLE #MYVOTES
DROP TABLE #MYELECTIONS
输出:
147 Manager 100 Tom Cruise 11111111 1
147 Manager 101 Micky Mouse 11111111 2
147 Manager 103 Donald Duck 11111111 3
147 Manager 100 Tom Cruise 22222222 1
147 Manager 101 Micky Mouse 22222222 0
147 Manager 103 Donald Duck 22222222 0
147 Manager 100 Tom Cruise 33333333 1
147 Manager 101 Micky Mouse 33333333 0
147 Manager 103 Donald Duck 33333333 0
147 Manager 100 Tom Cruise 44444444 1
147 Manager 101 Micky Mouse 44444444 0
147 Manager 103 Donald Duck 44444444 0
147 Manager 100 Tom Cruise 55555555 0
147 Manager 101 Micky Mouse 55555555 2
147 Manager 103 Donald Duck 55555555 0
147 Manager 100 Tom Cruise 66666666 0
147 Manager 101 Micky Mouse 66666666 1
147 Manager 103 Donald Duck 66666666 0
147 Manager 100 Tom Cruise 77777777 0
147 Manager 101 Micky Mouse 77777777 0
147 Manager 103 Donald Duck 77777777 1
147 Manager 100 Tom Cruise 88888888 0
147 Manager 101 Micky Mouse 88888888 0
147 Manager 103 Donald Duck 88888888 0
147 Manager 100 Tom Cruise 99999999 0
147 Manager 101 Micky Mouse 99999999 0
147 Manager 103 Donald Duck 99999999 0
我想请教一下这个问题的专业知识。
基本上我需要在匹配字段上合并两个数据集,但是,在 table1 中没有匹配记录与 table2 的情况下,输出 table 必须包含一个投票字段中的值,表示没有错过,值为 0。
这个适用的场景,是一个投票系统。三 table 选举、候选人和投票。
最后的输出table必须输出ELECTIONStable中有CANDIDATE的所有位置。然而,在一个职位的所有候选人的 VOTES table 中可能没有任何投票给他们。输出仍然必须 return 位置,并且 0 反对投票。到目前为止,我的代码是这样的。
CREATE TABLE #MYELECTIONS (E_POSITION_CODE INT, E_POSITIONNAME VARCHAR(50))
INSERT INTO #MYELECTIONS VALUES (147,'Manager')
INSERT INTO #MYELECTIONS VALUES (148,'Supervisor')
INSERT INTO #MYELECTIONS VALUES (149,'Counciler')
CREATE TABLE #MYCANDIDATES (C_CANDIDATE_CODE INT, C_CANDIDATENAME VARCHAR (50), C_POSITION_CODE INT)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 147)
INSERT INTO #MYCANDIDATES VALUES (101,'Micky Mouse', 147)
INSERT INTO #MYCANDIDATES VALUES (103,'Donald Duck', 147)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 148)
CREATE TABLE #MYVOTES (V_POSITION_CODE INT, V_CANDIDATE_CODE INT, V_VOTER VARCHAR(8), V_VOTINGPREFERENCE SMALLINT)
INSERT INTO #MYVOTES VALUES (147,100,'11111111',1)
INSERT INTO #MYVOTES VALUES (147,101,'11111111',2)
INSERT INTO #MYVOTES VALUES (147,103,'11111111',3)
INSERT INTO #MYVOTES VALUES (147,100,'22222222',1)
INSERT INTO #MYVOTES VALUES (147,100,'33333333',1)
INSERT INTO #MYVOTES VALUES (147,100,'44444444',1)
INSERT INTO #MYVOTES VALUES (147,101,'55555555',2)
INSERT INTO #MYVOTES VALUES (147,101,'66666666',1)
INSERT INTO #MYVOTES VALUES (147,103,'77777777',1)
INSERT INTO #MYVOTES VALUES (148,100,'88888888',1)
INSERT INTO #MYVOTES VALUES (148,100,'99999999',2)
DECLARE @MyPositionCode AS INT
SET @MyPositionCode = 147
------------------------------------------------------------------------------------
DECLARE @TEMPTABLE1 TABLE (T1_POSITIONCODE VARCHAR(3), T1_POSITIONNAME VARCHAR(255),
T1_CANDIDATECODE VARCHAR(8),T1_CANDIDATENAME VARCHAR(255))
INSERT INTO @TEMPTABLE1
SELECT
E_POSITION_CODE,
E_POSITIONNAME,
C_CANDIDATE_CODE,
C_CANDIDATENAME
FROM #MYELECTIONS
INNER JOIN #MYCANDIDATES ON
E_POSITION_CODE = C_POSITION_CODE
WHERE #MYELECTIONS.E_POSITION_CODE = @MYPOSITIONCODE
SELECT * FROM @TEMPTABLE1
-----------------------------------------------------------------------------------
DECLARE @TEMPTABLE2 TABLE (T2_POSITIONCODE VARCHAR(3), T2_CANDIDATECODE VARCHAR(8),
T2_VOTE SMALLINT, T2_VOTER VARCHAR(8))
INSERT INTO @TEMPTABLE2
SELECT
V_POSITION_CODE,
V_CANDIDATE_CODE,
ISNULL(V_VOTINGPREFERENCE,0) AS 'VOTES',
V_VOTER
FROM #MYVOTES
LEFT OUTER JOIN @TEMPTABLE1 ON
T1_POSITIONCODE = V_POSITION_CODE AND
T1_CANDIDATECODE = V_CANDIDATE_CODE
SELECT * FROM @TEMPTABLE2
最终输出应该是这样的:
T1_POSITION_CODE T1_POSITIONNAME T1_CANDIDATECODE T1_CANDIDATENAME T2_VOTER T2_VOTE
147 Manager 100 Tom Cruise 11111111 1
147 Manager 101 Micky Mouse 11111111 2
147 Manager 103 Donald Duck 11111111 3
147 Manager 100 Tom Cruise 22222222 1
147 Manager 101 Micky Mouse 22222222 0
147 Manager 103 Donald Duck 22222222 0
147 Manager 100 Tom Cruise 33333333 1
147 Manager 101 Micky Mouse 33333333 0
147 Manager 103 Donald Duck 33333333 0
147 Manager 100 Tom Cruise 44444444 1
147 Manager 101 Micky Mouse 44444444 0
147 Manager 103 Donald Duck 44444444 0
147 Manager 100 Tom Cruise 55555555 0
147 Manager 101 Micky Mouse 55555555 2
147 Manager 103 Donald Duck 55555555 0
147 Manager 100 Tom Cruise 66666666 1
147 Manager 101 Micky Mouse 66666666 0
147 Manager 103 Donald Duck 66666666 0
147 Manager 100 Tom Cruise 77777777 0
147 Manager 101 Micky Mouse 77777777 0
147 Manager 103 Donald Duck 77777777 1
147 Manager 100 Tom Cruise 88888888 1
147 Manager 101 Micky Mouse 88888888 0
147 Manager 103 Donald Duck 88888888 0
147 Manager 100 Tom Cruise 99999999 2
147 Manager 101 Micky Mouse 99999999 0
147 Manager 103 Donald Duck 99999999 0
因此,我们可以看到 0 被 return 反对投票列中的职位,有候选人,即使选民没有投票给他们。
提前致谢。
我不知道为什么147, 100, Tom Cruise, 99999999
在这里是2
。我觉得应该是0
。这适用于最后几位选民。
试试这样的东西:
CREATE TABLE #MYELECTIONS (E_POSITION_CODE INT, E_POSITIONNAME VARCHAR(50))
INSERT INTO #MYELECTIONS VALUES (147,'Manager')
INSERT INTO #MYELECTIONS VALUES (148,'Supervisor')
INSERT INTO #MYELECTIONS VALUES (149,'Counciler')
CREATE TABLE #MYCANDIDATES (C_CANDIDATE_CODE INT, C_CANDIDATENAME VARCHAR (50), C_POSITION_CODE INT)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 147)
INSERT INTO #MYCANDIDATES VALUES (101,'Micky Mouse', 147)
INSERT INTO #MYCANDIDATES VALUES (103,'Donald Duck', 147)
INSERT INTO #MYCANDIDATES VALUES (100,'Tom Cruise', 148)
CREATE TABLE #MYVOTES (V_POSITION_CODE INT, V_CANDIDATE_CODE INT, V_VOTER VARCHAR(8), V_VOTINGPREFERENCE SMALLINT)
INSERT INTO #MYVOTES VALUES (147,100,'11111111',1)
INSERT INTO #MYVOTES VALUES (147,101,'11111111',2)
INSERT INTO #MYVOTES VALUES (147,103,'11111111',3)
INSERT INTO #MYVOTES VALUES (147,100,'22222222',1)
INSERT INTO #MYVOTES VALUES (147,100,'33333333',1)
INSERT INTO #MYVOTES VALUES (147,100,'44444444',1)
INSERT INTO #MYVOTES VALUES (147,101,'55555555',2)
INSERT INTO #MYVOTES VALUES (147,101,'66666666',1)
INSERT INTO #MYVOTES VALUES (147,103,'77777777',1)
INSERT INTO #MYVOTES VALUES (148,100,'88888888',1)
INSERT INTO #MYVOTES VALUES (148,100,'99999999',2)
DECLARE @MyPositionCode AS INT = 147
SELECT me.E_POSITION_CODE ,
me.E_POSITIONNAME ,
mc.C_CANDIDATE_CODE ,
mc.C_CANDIDATENAME ,
c.V_VOTER ,
ISNULL(mv.V_VOTINGPREFERENCE, 0) AS V_VOTINGPREFERENCE
FROM #MYCANDIDATES mc
JOIN #MYELECTIONS me ON mc.C_POSITION_CODE = me.E_POSITION_CODE
CROSS JOIN ( SELECT DISTINCT
V_VOTER
FROM #MYVOTES
) c
LEFT JOIN #MYVOTES mv ON mc.C_POSITION_CODE = mv.V_POSITION_CODE
AND mc.C_CANDIDATE_CODE = mv.V_CANDIDATE_CODE
AND c.V_VOTER = mv.V_VOTER
WHERE mc.C_POSITION_CODE = @MyPositionCode
ORDER BY c.V_VOTER , C_CANDIDATE_CODE
DROP TABLE #MYCANDIDATES
DROP TABLE #MYVOTES
DROP TABLE #MYELECTIONS
输出:
147 Manager 100 Tom Cruise 11111111 1
147 Manager 101 Micky Mouse 11111111 2
147 Manager 103 Donald Duck 11111111 3
147 Manager 100 Tom Cruise 22222222 1
147 Manager 101 Micky Mouse 22222222 0
147 Manager 103 Donald Duck 22222222 0
147 Manager 100 Tom Cruise 33333333 1
147 Manager 101 Micky Mouse 33333333 0
147 Manager 103 Donald Duck 33333333 0
147 Manager 100 Tom Cruise 44444444 1
147 Manager 101 Micky Mouse 44444444 0
147 Manager 103 Donald Duck 44444444 0
147 Manager 100 Tom Cruise 55555555 0
147 Manager 101 Micky Mouse 55555555 2
147 Manager 103 Donald Duck 55555555 0
147 Manager 100 Tom Cruise 66666666 0
147 Manager 101 Micky Mouse 66666666 1
147 Manager 103 Donald Duck 66666666 0
147 Manager 100 Tom Cruise 77777777 0
147 Manager 101 Micky Mouse 77777777 0
147 Manager 103 Donald Duck 77777777 1
147 Manager 100 Tom Cruise 88888888 0
147 Manager 101 Micky Mouse 88888888 0
147 Manager 103 Donald Duck 88888888 0
147 Manager 100 Tom Cruise 99999999 0
147 Manager 101 Micky Mouse 99999999 0
147 Manager 103 Donald Duck 99999999 0