SQL UNION或JOIN 2选择

时间:2017-02-10 07:09:36

标签: sql sql-server

我将做一个简单的例子来更好地理解我正在尝试做的事情:

我有Selection 1女巫从4个表中获取数据inner join。结果如下图所示:

enter image description here

我有Selection 2女巫从另外4个表中获取数据。 这两个选择结果之间的唯一区别是第4列。

结果如下图所示:

enter image description here

我想要的结果是这样的:

enter image description here

如果我UNION ALL他将值放在下面(结果是20行),我不需要那样。 如果我在它们之间加入,我有10x10 = 100行。

EXEMPLE LINK:SQLFiddle

5 个答案:

答案 0 :(得分:1)

从内部联接的两个选择中获取数据,并仅显示两个选择中所需的列

;WITH CTE1
AS
(
    SELECT * FROM SELECTION1
)
,CTE2
AS
(
    SELECT * FROM SELECTION2
)

SELECT
CTE1.UNAME,
CTE1.PRE_NAME,
CTE1.TIME,
CTE1.FIRST_VALUE,
CTE2.FINAL_VALUE
FROM CTE1
INNER JOIN CTE2
ON CTE1.UNAME=CTE2.UNAME
AND CTE1.PRE_NAME=CTE2.PRE_NAME
AND CTE1.TIME=CTE2.TIME

<强>更新

FIDDLE

我试图从这两个表中获得一些独特的东西ROW_NUMBER()。这可能有所帮助。两个表中具有重复值的连接将使其仅为10x10行,而您不想要这些。

WITH CTE1
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY U_NAME) AS NO, * FROM SELECTION1
)
,CTE2
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY U_NAME) AS NO,* FROM SELECTION2
)

SELECT
CTE1.U_NAME,
CTE1.PRE_NAME,
CTE1.TIME,
CTE1.FIRST_VALUE,
CTE2.FINAL_VALUE
FROM CTE1
INNER JOIN CTE2
ON CTE1.NO=CTE2.NO

更新2

WITH CTE1
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY UD_NAME) AS NO, * FROM 
(
SELECT R0507UNIT_.R0507NAME_ AS UD_NAME,
R0101MAPAR.R0101NAME_ AS PRE_NAME,
TO_CHAR(D0903GSCHH.D0903TFROM + INTERVAL '2' HOUR, 'DD.MM.YYYY HH24:MI:SS') AS TIME_FROM,
D0904GSCHI.D0904POWER AS FINAL_POWER
FROM D0904GSCHI
INNER JOIN D0903GSCHH
ON
D0904GSCHI.D0903TFROM = D0903GSCHH.D0903TFROM
AND D0904GSCHI.D0903ID___ = D0903GSCHH.D0903ID___
INNER JOIN R0101MAPAR
ON
D0903GSCHH.R0101ID___ = R0101MAPAR.R0101ID___
INNER JOIN R0507UNIT_
ON
D0903GSCHH.R0507ID___=R0507UNIT_.R0507ID___
WHERE D0903GSCHH.D0903TFROM >= TO_DATE('07.02.2017 20:00','DD.MM.YYYY HH24:MI:SS')
AND D0903GSCHH.D0903TFROM < TO_DATE('08.02.2017 20:00','DD.MM.YYYY HH24:MI:SS')
--AND R0507UNIT_.R0507NAME_ = 'BUCV3'
) AS A --THIS IS AN ALIAS
)

答案 1 :(得分:0)

SELECT          A.U_NAME,
                A.PRE_NAME,
                A.TIME,
                A.FIRST_VALUE,
                B.FINAL_VALUE

FROM            Selection1 AS A

INNER JOIN      Selection2 AS B
    ON          A.U_NAME = B.U_NAME
        AND     A.PRE_NAME = B.PRE_NAME
        AND     A.TIME = B.TIME

答案 2 :(得分:0)

您需要使用INNER JOIN

将两个查询结合在一起
SELECT   s1.U_NAME
        ,s1.PRE_NAME
        ,s1.TIME
        ,s1.FIRST_VALUE
        ,s2.FINAL_VALUE
FROM (
    -- First query
    SELECT U_NAME, PRE_NAME, TIME, FIRST_VALUE
    FROM Selection1
) s1
INNER JOIN (
    -- Second query
    SELECT U_NAME, PRE_NAME, TIME, FINAL_VALUE
    FROM Selection1
) s2
    ON s1.U_NAME = s2.U_NAME
    AND s1.PRE_NAME = s2.PRE_NAME
    AND s1.TIME = s2.TIME
;

答案 3 :(得分:0)

如果我将这两个输入视为表,您可以通过这些表之间的另一个连接来实现所需的结果(但由于性能问题,我不会建议它)。

SELECT 
TBL1.U_NAME,TBL1.PRE_NAME,TBL1.TIME,TBL1.FIRST_VALUE,TBL2.FINAL_VALUE FROM  
FROM FIRSTTABLE TBL1 INNER JOIN SECONDTABLE TBL2 ON TBL1.U_NAME=TBL2.U_NAME 
AND TBL1.PRE_NAME=TBL2.PRE_NAME AND TBL1.TIME=TBL2.TIME 

我看到你已经有了一些内连接来获取FirstTable和SecondTable中的数据。如果这两个查询都使用公共表来提供数据,您也可以在单个查询中执行此操作。如果我正确理解您的问题,那么您正在寻找的结果集不需要Union。

如果您可以提供完整的查询,它将提供更多上下文,并可以提供更好的解决方案。

答案 4 :(得分:0)

BEGIN TRAN
CREATE TABLE #temp (U_Name Nvarchar(20),PRE_Name Nvarchar(20),Time Datetime,firstValue int)
CREATE TABLE #temp1 (U_Name Nvarchar(20),PRE_Name Nvarchar(20),Time Datetime,firstValue int)
INSERT INTO #temp
Select 'GV','NMOP','10.02.2017', 90 UNION ALL
Select 'GV','NMOP','10.02.2017', 100 UNION ALL
Select 'GV','NMOP','10.02.2017', 120 UNION ALL
Select 'GV','NMOP','10.02.2017', 300 UNION ALL
Select 'GV','NMOP','10.02.2017', 200 UNION ALL
Select 'GV','NMOP','10.02.2017', 100 UNION ALL
Select 'GV','NMOP','10.02.2017', 50 UNION ALL
Select 'GV','NMOP','10.02.2017', 60 UNION ALL
Select 'GV','NMOP','10.02.2017', 70 UNION ALL
Select 'GV','NMOP','10.02.2017', 10 

INsert into #temp1
Select 'GV','NMOP','10.02.2017', 60 UNION ALL
Select 'GV','NMOP','10.02.2017', 52 UNION ALL
Select 'GV','NMOP','10.02.2017', 10 UNION ALL
Select 'GV','NMOP','10.02.2017', 300 UNION ALL
Select 'GV','NMOP','10.02.2017', 33 UNION ALL
Select 'GV','NMOP','10.02.2017', 100 UNION ALL
Select 'GV','NMOP','10.02.2017', 50 UNION ALL
Select 'GV','NMOP','10.02.2017', 56 UNION ALL
Select 'GV','NMOP','10.02.2017', 99 UNION ALL
Select 'GV','NMOP','10.02.2017', 10 

 SELECT ROW_NUMBER() OVER (ORDER BY U_NAME) AS Rowno,a.U_Name, a.PRE_Name,a.Time,a.firstValue into #t from #temp a
 SELECT ROW_NUMBER() OVER (ORDER BY U_NAME) AS Rowno, b.U_Name, b.PRE_Name,b.Time,b.firstValue as finalValue INTO #TT from #temp1 b

 SELECT a.U_Name,a.PRE_Name,a.Time,a.firstValue,  b.finalValue 
 FROM #t  a
 INNER JOIN #TT b ON a.Rowno=b.Rowno AND a.U_Name=b.U_Name AND a.PRE_Name=b.PRE_Name AND a.time=b.Time


ROLLBACK TRAN