簡體   English   中英

SQL SERVER查詢中的UNION

[英]UNION in SQL SERVER query

我是SQL SERVER的初學者。 我有這個2查詢:

第一個查詢:

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

第二查詢:

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

當我嘗試運行這兩個查詢時,結果顯示完美,但是當我嘗試使用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

出現此錯誤消息:

消息104,第15級,狀態1,第1行
如果該語句包含UNION運算符,則ORDER BY項目必須出現在選擇列表中。

誰能告訴我如何解決此錯誤?

錯誤消息已經指出了答案。 只需在查詢中刪除兩個“ ORDER BY DAJ_TKHDE DESC”即可。 這就對了! 然后再次運行聯合查詢。

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

更新

要提供第二種解決方案(替代方法),

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

insert into @MyTable
your first query

insert into @MyTable
your second query

select * from @MyTable

您應該能夠首先使用窗口CTE來消除子查詢中對訂單的需求。 字段的復雜性使得我還沒有建立示例數據來進行驗證,但是類似:

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

sql-server-order-by-in-subquery-with-union中也有類似的討論。

您將需要重新安排查詢。 我在以下查詢中的目的是將子查詢值(在表變量中具有“ 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 

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

注意:此查詢未經測試,因為我沒有示例數據。 因此請在使用前進行徹底測試。 您需要以在主查詢中刪除訂單為目標。

您是否有可能因不必要的合並而使它過於復雜? 我在跟蹤表/字段名稱時遇到了一些麻煩,但是我認為您要嘗試做的只是將OK或NOT OK冒泡並計算發生的次數。 也許用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

只需從1st select查詢中刪除訂單即可。 使用聯合時,這是不允許的。 因此,您將收到此錯誤。

使用聯合時,只能在最后一個(此處為2nd)select查詢中使用order by子句。

如果您的需求確實也需要在第一個查詢中排序,則可以在此處找到解決方案。

SQL查詢-在UNION中使用Order By

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM