繁体   English   中英

如何联合两个具有不同列的表

[英]How do I Union two tables with different columns

我有两个名为 Table_A 和 Table_B 的表,如下所示。

表_A

+-------+------------+------+---------+-----+
|MonthId|DepartmentId|Salary|Deduction| Paid|
+-------+------------+------+---------+-----+
|01/2016|    DEP01   | 1000 |     100 |  900|
|01/2016|    DEP02   | 2000 |      50 | 1950|
|01/2016|    DEP03   | 1500 |       0 | 1500|
|       |            |      |         |     |
|02/2016|    DEP01   | 1000 |     100 |  900|
|02/2016|    DEP02   | 2000 |      50 | 1950|
|02/2016|    DEP03   | 1500 |       0 | 1500|
+-------------------------------------------+

表_B

+-------+------------+------+---------+-----+------+------+
|MonthId|DepartmentId|Salary|Deduction| Paid|Bank_1|Bank_2|
+-------+------------+------+---------+-----+------+------+
|01/2016|    DEP01   | 1000 |     100 |  900|  400 |  500 |
|01/2016|    DEP02   | 2000 |      50 | 1950| 1400 |  550 |
|01/2016|    DEP03   | 1500 |       0 | 1500|    0 | 1500 |
+---------------------------------------------------------+

所以当我尝试

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Null AS Bank_1, Null AS Bank_2
FROM Table_A 
WHERE MonthId = '02/2016'

UNION

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Bank_1, Bank_2
FROM Table_B 
WHERE MonthId = '02/2016'

WHERE MonthId = '02/2016'

我得到了我需要的东西但是如果尝试

WHERE MonthId = '01/2016'

我得到了结果。 所以请帮我解决这个问题。

+-------+------------+------+---------+-----+------+------+
|MonthId|DepartmentId|Salary|Deduction| Paid|Bank_1|Bank_2|
+-------+------------+------+---------+-----+------+------+
|01/2016|    DEP01   | 1000 |     100 |  900| NULL | NULL |
|01/2016|    DEP01   | 1000 |     100 |  900|  400 |  500 |
|01/2016|    DEP02   | 2000 |      50 | 1950| NULL | NULL |
|01/2016|    DEP02   | 2000 |      50 | 1950| 1400 |  550 |
|01/2016|    DEP03   | 1500 |       0 | 1500| NULL | NULL |
|01/2016|    DEP03   | 1500 |       0 | 1500|    0 | 1500 |
+---------------------------------------------------------+

我怀疑你想要聚合:

SELECT MonthId, DepartmentId, Salary, Deduction, Paid, MAX(Bank_1), MAX(Bank_2)
FROM (SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Null AS Bank_1, Null AS Bank_2
      FROM Table_A 
      WHERE MonthId = '02/2016'
      UNION ALL
      SELECT MonthId, DepartmentId, Salary, Deduction, Paid, Bank_1, Bank_2
      FROM Table_B 
      WHERE MonthId = '02/2016'
     ) ab
GROUP BY MonthId, DepartmentId, Salary, Deduction, Paid;

我认为LEFT JOIN应该这样做:

样本数据:

    CREATE TABLE #Table_A (MonthId VARCHAR(10), DepartmentId varchar(10), Salary int ,Deduction int, Paid int)
INSERT INTO #Table_A
VALUES
('01/2016','DEP01','1000','100','900'),
('01/2016','DEP02','2000','50','1950'),
('01/2016','DEP03','1500','0','1500'),
('02/2016','DEP01','1000','100','900'),
('02/2016','DEP02','2000','50','1950'),
('02/2016','DEP03','1500','0','1500')

CREATE TABLE #Table_B (MonthId  VARCHAR(10), DepartmentId varchar(10), Salary int ,Deduction int, Paid int, Bank_1 int ,Bank_2 int )
INSERT INTO #Table_B
VALUES
('01/2016','DEP01','1000','100','900','400','500'),
('01/2016','DEP02','2000','50','1950','1400','550'),
('01/2016','DEP03','1500','0','1500','0','1500')

使用 WHERE 子句查询:

SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid
WHERE A.MonthId = '01/2016'

结果:

在此处输入图片说明

没有 WHERE 子句的查询:

SELECT  A.MonthId, 
       A.DepartmentId, 
       A.Salary, 
       A.Deduction, 
       A.Paid, 
       B.Bank_1, 
       B.Bank_2
FROM       #Table_A AS A LEFT OUTER JOIN 
       #Table_B AS B ON A.MonthId = B.MonthId AND 
                    A.DepartmentId = B.DepartmentId AND 
                    A.Salary = B.Salary AND 
                    A.Deduction = B.Deduction AND 
                    A.Paid = B.Paid

结果(您在 02/2016 的 Bank_1 、Bank_2 中将没有任何值,因为 #Table_B 中没有该 MonthId 的记录):

在此处输入图片说明

看起来您应该使用 LEFT OUTER JOIN 而不是联合,如果我猜测您想要 table1 中的所有值,以及 Bank_1 和 Bank_2 值(如果它们存在)是正确的。 这应该有效:

SELECT A.MonthId, A.DepartmentId, A.Salary, A.Deduction, A.Paid, B.Bank_1, B.Bank_2
FROM Table_A AS A
LEFT OUTER JOIN Table_B AS B
ON A.MonthId = B.MonthId
AND A.DepartmentId = B.DepartmentId
WHERE A.MonthId = '02/2016'   
DECLARE @table1 VARCHAR(255) = 'table_A' 
DECLARE @table2 VARCHAR(255) = 'table_B'

DECLARE @col1 VARCHAR(MAX) SELECT @col1 = COALESCE(@col1+',' ,'') + ISNULL(t.a, 'NULL as ' + t.b) 
FROM    
(       SELECT              
           a.COLUMN_NAME as a           
           ,b.COLUMN_NAME as b      
        FROM            
        (
                SELECT
                    COLUMN_NAME
                FROM 
                    INFORMATION_SCHEMA.COLUMNS
                WHERE 
                    TABLE_NAME = @table1            
         ) a            
         FULL JOIN
        (
                SELECT
                    COLUMN_NAME
                FROM 
                    INFORMATION_SCHEMA.COLUMNS
                WHERE 
                    TABLE_NAME = @table2            
        ) b
        ON a.COLUMN_NAME = b.COLUMN_NAME        
) t
--SELECT @cl1

DECLARE @col2 VARCHAR(MAX) SELECT @col2 = COALESCE(@col2+',' ,'') + ISNULL(t.b, 'NULL as ' + t.a) 
FROM    
(       SELECT              
           a.COLUMN_NAME as a           
           ,b.COLUMN_NAME as b      
        FROM            
        (
                SELECT
                    COLUMN_NAME
                FROM 
                    INFORMATION_SCHEMA.COLUMNS
                WHERE 
                    TABLE_NAME = @table1            
         ) a            
         FULL JOIN              
         (
                SELECT
                    COLUMN_NAME
                FROM 
                    INFORMATION_SCHEMA.COLUMNS
                WHERE 
                    TABLE_NAME = @table2            
         ) b            
         ON a.COLUMN_NAME = b.COLUMN_NAME       
) t
--SELECT @table2


DECLARE @DynSQL nvarchar(MAX) Set @DynSQL = 'SELECT ' + @col1 + ' FROM ' + @table1 + ' UNION ALL SELECT ' + @col2 + ' FROM ' + @table2


exec sp_executesql @DynSQL

暂无
暂无

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

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