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