0

次の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も指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。メッセージ156、レベル15、状態1、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-1238569-1234
4985-1234


結果リストにcd_relnaamを追加したいのですが、クエリでJOINを使用すると、結果が空白になります...

誰かが私が間違っていることを知っていますか?

4

2 に答える 2

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 != ''
于 2012-10-19T06:55:29.513 に答える
1

ここでの問題は、GROUP BY ではそれほど問題ではなく、実際には ORDER BY にあります。サブクエリに入れることはできません。親のほとんどのクエリにある必要があります。また、cd_kvkanum が複数回発生し、空白ではない er_105 からのレコードが必要であると理解していますが、集計はしたくありません。

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(*) ではなく SELECT something,COUNT(PrimaryKey) を実行する方が適切です。* は、SQL に * の意味を理解する追加のステップを実行させます。もちろん、stackoverflow の多くのクエリと同様に、より簡単な方法で記述できます ;)

于 2012-10-19T08:24:23.003 に答える