2012-10-19 114 views
0

我有以下SQL查詢:SQL子查詢由

SELECT 
kvknum.cd_hfdrelnr, 
kvknum.cd_kvkanum, 
    relName.cd_hfdrelnr 
FROM 
(
    SELECT 
     cd_hfdrelnr, 
     cd_kvkanum 

FROM er_105 
WHERE cd_kvkanum IN 
(
    SELECT cd_kvkanum 
    FROM er_105 
    GROUP BY cd_kvkanum 
    HAVING COUNT(*) > 1 
) 
AND cd_kvkanum != '' 
ORDER BY cd_kvkanum 
) AS kvknum 
LEFT OUTER JOIN 
(
    SELECT 
     cd_hfdrelnr, 
     cd_relnaam 
    FROM er_101 
) AS relName 
ON kvknum.cd_hfdrelnr = relName.cd_hfdrelnr 

GROUP BY功能是不允許的,它是需要這樣相同cd_kvkanum值下彼此一起示出,有一個變通對於這個或者這個可能如何實現?

跟隨誤差與它來:

「消息1033,級別15,狀態1,行21 ORDER BY子句在視圖,內聯函數,派生表,子查詢無效,公用表表達式,除非TOP或FOR XML也被指定 Msg 156,Level 15,State 1,Line 28 關鍵字'AS'附近的語法不正確。

當我運行以下查詢:

SELECT 
    cd_hfdrelnr, 
    cd_kvkanum 

FROM er_105 
WHERE cd_kvkanum IN 
(
    SELECT cd_kvkanum 
    FROM er_105 
    GROUP BY cd_kvkanum 
    HAVING COUNT(*) > 1 
) 
AND cd_kvkanum != '' 
ORDER BY cd_kvkanum 

(的加盟第一子查詢)的結果如下:
1235 - 123
4652 - 123
8569 - 1234
4985 - 1234

雖然我想cd_relnaam添加到結果列表, 時,只需使用該查詢我的結果的JOIN是空白......

任何人知道我做錯了什麼?

+2

示例數據?預期結果?你的意思是「儘管按功能分組是不允許的」。請嘗試在問題中添加* some *上下文。我們不介意讀者。 –

+0

用更多的信息更新:) –

回答

1

這不是一個完整的答案,但是,如果我沒有弄錯,你的查詢可以寫得更簡單。當人們編寫簡單的查詢時,會寫出非常複雜的查詢,而出現90%的錯誤。簡單是成功的關鍵:)當你給了更準確的問題

SELECT 
    kvknum.cd_hfdrelnr, 
    kvknum.cd_kvkanum, 
    relName.cd_hfdrelnr 
FROM er_105 as kvknum 
    LEFT OUTER JOIN er_101 as relName on relName.cd_hfdrelnr = kvknum.cd_hfdrelnr 
where 
    kvknum.cd_kvkanum IN 
    (
     SELECT cd_kvkanum 
     FROM er_105 
     GROUP BY cd_kvkanum 
     HAVING COUNT(*) > 1 
    ) AND 
    cd_kvkanum != '' 
+0

隨着查詢你創建的問題是結果不是「按分組」的匹配結果,例如你得到: id - anumer –

+0

你可以請添加樣本數據(2-3記錄er_105 ,er_101表)和期望的結果? –

1

這裏的問題與其說與GROUP BY我將修改的答案,它實際上是與ORDER BY,你不能把它放在一個子查詢中,它必須在你父母的大部分查詢中。 另外我的理解是,你想從er_105的記錄,其中cd_kvkanum發生多次,而不是空白,但你不想聚合。

SELECT er_105.cd_hfdrelnr, 
     er_105.cd_kvkanum, 
     er_101.cd_relnaam 
    FROM er_105 
    JOIN (SELECT cd_kvkanum,COUNT(cd_kvkanum) 
      FROM er_105 
     WHERE cd_kvkanum != '' 
     GROUP BY cd_kvkanum 
     HAVING COUNT(cd_kvkanum) > 1 
     ) kvknum ON er_105.cd_kvkanum = kvknum.cd_kvkanum 
LEFT JOIN er_101 ON er_105.cd_hfdrelnr = er_101.cd_hfdrelnr 
ORDER BY er_105.cd_kvkanum 

通常當你要計算的東西出現次數,做選擇一些東西,COUNT(PrimaryKey的),而不是COUNT(*),它的更好。 *使SQL進行了確定*代表什麼的額外步驟。當然,就像在stackoverflow上有許多查詢一樣,總是有一種更簡單的方式來編寫它;)