0

このようなSQL ServerにSQLクエリが1つあります

SELECT 
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY _no ORDER BY _no asc) = 1 THEN 
                        _no ELSE '' END 
    as row_no,
    _no,
    _name,
    r._names
FROM
(
    SELECT '1' as _no, 'vikas' as _name UNION ALL
    SELECT '1', 'kratika' UNION ALL
    SELECT '2', 'vikas' UNION ALL
    SELECT '1', 'kratika kastwar' 
) t
INNER JOIN 
(
    SELECT '1' as _nos, 'One' as _names UNION ALL
    SELECT '2', 'two' 
) r
ON r._nos = t._no
ORDER BY _no

出力:

row_no _no  _name           _names
------ ---- --------------- ------
1      1    kratika         One
       1    kratika kastwar One
       1    vikas           One
2      2    vikas           two

そして、私はこのようにMySQLでやっているのと同じです

SELECT 
    CASE WHEN _no = @i THEN '' ELSE @i := _no END
    as row_no,
    _no,
    _name,
    r._names
FROM
(
    SELECT '1' as _no, 'vikas' as _name UNION ALL
    SELECT '1', 'kratika' UNION ALL
    SELECT '2', 'vikas' UNION ALL
    SELECT '1', 'kratika kastwar' 
) t
INNER JOIN 
(
    SELECT '1' as _nos, 'One' as _names UNION ALL
    SELECT '2', 'two' 
) r
ON r._nos = t._no
,
(SELECT @i := '') temp
ORDER BY _no

出力:

1   1   vikas           One
    1   kratika         One
1   1   kratika kastwar One
2   2   vikas           two

しかし、私は このようなMySQLの出力を期待しています

1      1    kratika         One
       1    kratika kastwar One
       1    vikas           One
2      2    vikas           two

MySQLでこのようなクエリを使用したくありません。desc here MYSQL Order By W/Count

SELECT 
    CASE WHEN _no = @i THEN '' ELSE @i := _no END
    as row_no,
    _no,
    _name,
    _names
FROM
(SELECT 
    *
FROM
(
    SELECT '1' as _no, 'vikas' as _name UNION ALL
    SELECT '1', 'kratika' UNION ALL
    SELECT '2', 'vikas' UNION ALL
    SELECT '1', 'kratika kastwar' 
) t
INNER JOIN 
(
    SELECT '1' as _nos, 'One' as _names UNION ALL
    SELECT '2', 'two' 
) r
ON r._nos = t._no
,
(SELECT @i := '') temp
ORDER BY _no) t

MySQLで同じことを達成する方法、クエリのパフォーマンスは主要なパラメーターです

4

2 に答える 2

1

ここで起こっていることは、MySQL が結果セットを構築し、ORDER BY 句に従って順序付けするための追加の手順を実行していることだと思います。'kratika kastwar'行 where _noisの後に行がある2ため、予期しない出力が得られます。

SELECT解決策は、基本的なもの(特別なユーザー変数の悪ふざけなし) を節のサブクエリに入れ、FROMその節をサブクエリに適用することだと思いORDER BYます。次に、外側のクエリでユーザー変数の作業を行います。そうすれば、注文はすでに行われています。

編集:あなたはこれをしたくないと言ったようです。ORDER BY計算された結果に対してファイルソートステップを実行することにより、MySQL がこれを実行しないようにする方法を見つけられない限り (ほとんどありません)、選択の余地はないと思います。

于 2013-01-30T09:16:11.857 に答える
0
SELECT 
    CASE WHEN _no = @i THEN '' ELSE @i := _no END
    as row_no,
    _no,
    _name,
    _names
FROM
(SELECT 
    *
FROM
(
    SELECT '1' as _no, 'vikas' as _name UNION ALL
    SELECT '1', 'kratika' UNION ALL
    SELECT '2', 'vikas' UNION ALL
    SELECT '1', 'kratika kastwar' 
) t
INNER JOIN 
(
    SELECT '1' as _nos, 'One' as _names UNION ALL
    SELECT '2', 'two' 
) r
ON r._nos = t._no
,
(SELECT @i := '') 
于 2013-01-30T09:06:53.147 に答える