简体   繁体   English

SQL SERVER查询中的UNION

[英]UNION in SQL SERVER query

I am beginner in SQL SERVER. 我是SQL SERVER的初学者。 I have this 2 query: 我有这个2查询:

1st query: 第一个查询:

SELECT 'OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR ORDER BY DAJ_TKHDE DESC )='OK') D

2nd query: 第二查询:

SELECT 'NOT OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR ORDER BY DAJ_TKHDE DESC )='NOT OK') D

When I try to run this two query, the result show up perfectly but when I try to combine this two query using UNION like this: 当我尝试运行这两个查询时,结果显示完美,但是当我尝试使用UNION合并这两个查询时,如下所示:

SELECT 'OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR ORDER BY DAJ_TKHDE DESC )='OK') D
UNION
SELECT 'NOT OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR ORDER BY DAJ_TKHDE DESC )='NOT OK') D

This error message show up: 出现此错误消息:

Msg 104, Level 15, State 1, Line 1 消息104,第15级,状态1,第1行
ORDER BY items must appear in the select list if the statement contains a UNION operator. 如果该语句包含UNION运算符,则ORDER BY项目必须出现在选择列表中。

Can anyone show me how to fix this error? 谁能告诉我如何解决此错误?

The error message already points out the answer. 错误消息已经指出了答案。 Simply delete both 'ORDER BY DAJ_TKHDE DESC' in queries. 只需在查询中删除两个“ ORDER BY DAJ_TKHDE DESC”即可。 That is it! 这就对了! Then run the union query again. 然后再次运行联合查询。

SELECT 'OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR)='OK') D

UNION

SELECT 'NOT OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND (SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE     
DAJ_NODAFTAR=D.DAJ_NODAFTAR)='NOT OK') D

update 更新

To provide a second solution (alternative method), 要提供第二种解决方案(替代方法),

declare @MyTable table
(
    Status varchar(25),
    Count int
)

insert into @MyTable
your first query

insert into @MyTable
your second query

select * from @MyTable

You should be able to use a windowed CTE first to eliminate the need for the order in the subqueries. 您应该能够首先使用窗口CTE来消除子查询中对订单的需求。 The fields complexity is such that I haven't built sample data to verify, but something like: 字段的复杂性使得我还没有建立示例数据来进行验证,但是类似:

WITH cte AS (
 SELECT DAJ_KLASIFIKASI
       ,DAJ_NODAFTAR
       ,ROW_NUMBER() OVER (PARTITION BY DAJ_NODAFTAR ORDER BY DAJ_TKHDE DESC)
   FROM BATM112_RKDKLASIFIKASI
)
SELECT 'OK' AS STATUS,
       COUNT(*) AS BIL
FROM   (SELECT D.DAJ_NODAFTAR
        FROM   BATM112_DES_AMJENTERA AS D
        WHERE  D.DAJ_KODKAT = 'VTC'
               AND (SELECT DAJ_KLASIFIKASI FROM cte WHERE DAJ_NODAFTAR = D.DAJ_NODAFTAR AND rn=1) = 'OK') AS D
UNION
SELECT 'NOT OK' AS STATUS,
       COUNT(*) AS BIL
FROM   (SELECT D.DAJ_NODAFTAR
        FROM   BATM112_DES_AMJENTERA AS D
        WHERE  D.DAJ_KODKAT = 'VTC'
               AND (SELECT DAJ_KLASIFIKASI FROM cte WHERE DAJ_NODAFTAR = D.DAJ_NODAFTAR AND rn=1) = 'NOT OK') AS D

There is a similar discussion over at sql-server-order-by-in-subquery-with-union . sql-server-order-by-in-subquery-with-union中也有类似的讨论。

you will need to rearrange the queries. 您将需要重新安排查询。 my aim with below queries are to keep the subquery value (the query that has the "order by" in a table variable) in a table variable and the table variable will replace your subquery with out "Order by" 我在以下查询中的目的是将子查询值(在表变量中具有“ order by”的查询)保留在表变量中,并且该表变量会将子查询替换为“ Order by”

Declare @temp Table
(
 DAJ_KLASIFIKASI nvarchar(50)
)

Insert into @temp values
SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE   
DAJ_NODAFTAR in ( SELECT D.DAJ_NODAFTAR FROM BATM112_DES_AMJENTERA AS D WHERE D.DAJ_KODKAT='VTC') and DAJ_Klasifikasi = 'NOT OK' ORDER BY DAJ_TKHDE DESC 

Insert into @temp values
SELECT TOP 1 DAJ_KLASIFIKASI FROM BATM112_RKDKLASIFIKASI WHERE   
DAJ_NODAFTAR in (SELECT D.DAJ_NODAFTAR FROM BATM112_DES_AMJENTERA AS D WHERE D.DAJ_KODKAT='VTC') and DAJ_Klasifikasi = 'OK' ORDER BY DAJ_TKHDE DESC 

YOur modified query: Y我们修改后的查询:

SELECT 'OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND ((SELECT DAJ_KLASIFIKASI FROM @temp where DAJ_Klasifikasi='OK')='OK') D
UNION
SELECT 'NOT OK' AS STATUS, COUNT(*) AS BIL 
FROM 
(SELECT D.DAJ_NODAFTAR 
FROM BATM112_DES_AMJENTERA AS D 
WHERE D.DAJ_KODKAT='VTC' 
AND ((SELECT DAJ_KLASIFIKASI FROM @temp where DAJ_Klasifikasi='NOT OK')='NOT OK') D

Note: this query is not tested since i do not have the example data. 注意:此查询未经测试,因为我没有示例数据。 so please test it thoroughly before use it. 因此请在使用前进行彻底测试。 you need to aim to remove the order by in you main query. 您需要以在主查询中删除订单为目标。

Is it possible you've over complicated it with an unnecessary union? 您是否有可能因不必要的合并而使它过于复杂? I have a little trouble following the table/field names, but I think all you trying to do is bubble up an OK or NOT OK and count the occurrences. 我在跟踪表/字段名称时遇到了一些麻烦,但是我认为您要尝试做的只是将OK或NOT OK冒泡并计算发生的次数。 Maybe something with a GROUP BY instead? 也许用GROUP BY代替?

SELECT STATUS,
       COUNT(*) AS BIL
  FROM (SELECT D.DAJ_NODAFTAR
              ,(SELECT TOP 1 
                       DAJ_KLASIFIKASI
                  FROM BATM112_RKDKLASIFIKASI
                 WHERE DAJ_NODAFTAR = D.DAJ_NODAFTAR
                 ORDER BY DAJ_TKHDE DESC) STATUS
          FROM BATM112_DES_AMJENTERA AS D
         WHERE D.DAJ_KODKAT = 'VTC') a
 GROUP BY STATUS

Just remove the order by from 1st select query. 只需从1st select查询中删除订单即可。 When using union, this is not allowed. 使用联合时,这是不允许的。 So, you are getting this error. 因此,您将收到此错误。

When using union, you can use order by clause in the last ( here 2nd ) select query only. 使用联合时,只能在最后一个(此处为2nd)select查询中使用order by子句。

If your requirement really needs order by in the 1st query too, the solution can be found here. 如果您的需求确实也需要在第一个查询中排序,则可以在此处找到解决方案。

SQL Query - Using Order By in UNION SQL查询-在UNION中使用Order By

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

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