Sql server SQL Server:使用union添加新列

Sql server SQL Server:使用union添加新列,sql-server,sql-server-2012,union,Sql Server,Sql Server 2012,Union,我有两个表,共有两列,两个表中有一列不同 表A 表B 我需要创建一个具有如下值的公共表 预期产量 我尝试在Memid和Meas上使用join,但它重复了,因为2字段没有创建唯一集,如图所示 我尝试了联合,但后来我得到了这样的结果集 具有不同条件的内部联接的输出 我如何着手实现期望的结果集 注意:在这种情况下,两列的值似乎相似,但它们可能不同 基本上,我需要创建一个包含4列的表,其中Payer和PPayer列应该相互独立。您不需要使用UNION,您可以使用内部联接尝试如下操作 INSER

我有两个表,共有两列,两个表中有一列不同

表A

表B

我需要创建一个具有如下值的公共表

预期产量

我尝试在Memid和Meas上使用join,但它重复了,因为2字段没有创建唯一集,如图所示

我尝试了联合,但后来我得到了这样的结果集

具有不同条件的内部联接的输出

我如何着手实现期望的结果集

注意:在这种情况下,两列的值似乎相似,但它们可能不同


基本上,我需要创建一个包含4列的表,其中Payer和PPayer列应该相互独立。

您不需要使用
UNION
,您可以使用
内部联接尝试如下操作

INSERT INTO NewTable (
    UserId
    ,DEPT
    ,ROOM
    ,LAB
    )
SELECT DISTINCT ta.UserId
    ,ta.DEPT
    ,ta.ROOM
    ,tb.LAB
FROM TableA ta
INNER JOIN TableB tb ON ta.UserId = tb.UserId
    AND ta.DEPT = tb.DEPT

沙纳瓦兹·汗,试试这个解决方案

声明样本表

DECLARE @A as TABLE(
UserId INT,
DEPT VARCHAR(50),
ROOM INT)

DECLARE @B as TABLE(
UserId INT,
DEPT VARCHAR(50),
LAB VARCHAR(50))
INSERT INTO @A (UserId,DEPT,ROOM) VALUES(1,'A',1),(1,'B',1),(1,'A',2),(1,'B',2)
INSERT INTO @B (UserId,DEPT,LAB) VALUES(1,'A','P'),(1,'B','Q'),(1,'A','P'),(1,'B','Q')
SELECT ROW_NUMBER() OVER(PARTITION BY A.DEPT ORDER BY A.ROOM ) AS Rno,* INTO #tbl_A FROM @A A 
SELECT  ROW_NUMBER() OVER(PARTITION BY B.DEPT ORDER BY B.LAB) AS Rno,* INTO #tbl_B FROM @B B
DROP TABLE #tbl_A,#tbl_B
在创建的表中插入样本记录

DECLARE @A as TABLE(
UserId INT,
DEPT VARCHAR(50),
ROOM INT)

DECLARE @B as TABLE(
UserId INT,
DEPT VARCHAR(50),
LAB VARCHAR(50))
INSERT INTO @A (UserId,DEPT,ROOM) VALUES(1,'A',1),(1,'B',1),(1,'A',2),(1,'B',2)
INSERT INTO @B (UserId,DEPT,LAB) VALUES(1,'A','P'),(1,'B','Q'),(1,'A','P'),(1,'B','Q')
SELECT ROW_NUMBER() OVER(PARTITION BY A.DEPT ORDER BY A.ROOM ) AS Rno,* INTO #tbl_A FROM @A A 
SELECT  ROW_NUMBER() OVER(PARTITION BY B.DEPT ORDER BY B.LAB) AS Rno,* INTO #tbl_B FROM @B B
DROP TABLE #tbl_A,#tbl_B
为两个表生成部门行号并插入另一个表中

DECLARE @A as TABLE(
UserId INT,
DEPT VARCHAR(50),
ROOM INT)

DECLARE @B as TABLE(
UserId INT,
DEPT VARCHAR(50),
LAB VARCHAR(50))
INSERT INTO @A (UserId,DEPT,ROOM) VALUES(1,'A',1),(1,'B',1),(1,'A',2),(1,'B',2)
INSERT INTO @B (UserId,DEPT,LAB) VALUES(1,'A','P'),(1,'B','Q'),(1,'A','P'),(1,'B','Q')
SELECT ROW_NUMBER() OVER(PARTITION BY A.DEPT ORDER BY A.ROOM ) AS Rno,* INTO #tbl_A FROM @A A 
SELECT  ROW_NUMBER() OVER(PARTITION BY B.DEPT ORDER BY B.LAB) AS Rno,* INTO #tbl_B FROM @B B
DROP TABLE #tbl_A,#tbl_B
使用内部联接的最终查询

SELECT  A.UserId,A.DEPT,A.ROOM,B.LAB FROM #tbl_A  AS A
INNER JOIN #tbl_B AS B ON A.Rno =B.Rno AND A.DEPT =B.DEPT ORDER BY A.ROOM, B.DEPT
滴滴创造的诱惑

DECLARE @A as TABLE(
UserId INT,
DEPT VARCHAR(50),
ROOM INT)

DECLARE @B as TABLE(
UserId INT,
DEPT VARCHAR(50),
LAB VARCHAR(50))
INSERT INTO @A (UserId,DEPT,ROOM) VALUES(1,'A',1),(1,'B',1),(1,'A',2),(1,'B',2)
INSERT INTO @B (UserId,DEPT,LAB) VALUES(1,'A','P'),(1,'B','Q'),(1,'A','P'),(1,'B','Q')
SELECT ROW_NUMBER() OVER(PARTITION BY A.DEPT ORDER BY A.ROOM ) AS Rno,* INTO #tbl_A FROM @A A 
SELECT  ROW_NUMBER() OVER(PARTITION BY B.DEPT ORDER BY B.LAB) AS Rno,* INTO #tbl_B FROM @B B
DROP TABLE #tbl_A,#tbl_B
输出


内部联接复制了行、实验室和部门,然后有它不应该有的组合。您能显示预期的输出吗?第三个表是预期的输出应该是什么样子?必须放置DISTINCT,我已经更新了答案。不,联接即使使用DISTINCT也不起作用。我最接近的是Union,但我似乎无法将两个表合并到表中以匹配输出。这里有与此逻辑不起作用的异常值。您知道我们是否可以使用union合并这两个表吗?union允许将多个查询的结果合并到一个结果集中,在您的情况下,您希望合并两个不同的表,因此应该使用join,而不是union。