0

テーブルに PromoID フィールドがあります。最初の 6 文字が同じであるすべてのレコードを表示する方法を理解する必要があります。

PromoID
=======
100001
100001A
100001B
101001
100002
100002A

上記から期待される結果は次のようになります。

PromoID
=======
100001
100001A
100001B
100002
100002A

101001 は、「101001」プレフィックスを持つ別のレコードがないため、削除されます。

ありがとう

4

5 に答える 5

8
SELECT PromoID
FROM YourTable A
WHERE EXISTS(SELECT LEFT(PromoID,6)
             FROM YourTable
             WHERE LEFT(PromoID,6) = LEFT(A.PromoID,6)
             GROUP BY LEFT(PromoID,6)
             HAVING COUNT(*) > 1)

結果は次のとおりです。

╔═════════╗
║ PromoID ║
╠═════════╣
║ 100001  ║
║ 100001A ║
║ 100001B ║
║ 100002  ║
║ 100002A ║
╚═════════╝

これはデモ付きのsqlfiddleです

于 2013-07-15T16:27:47.247 に答える
6

SQL Server 2005 以降のバージョンを使用している場合、これでうまくいくはずです。

SELECT PromoID
FROM (
  SELECT *, COUNT(*) OVER (PARTITION BY LEFT(PromoID, 6)) AS cnt
  FROM atable
) s
WHERE cnt > 1
;

これは SQL Fiddleでも試すことができます。

于 2013-07-15T16:40:33.430 に答える
1

サブセレクトを使用してこれを行うこともできます

SELECT PromoID FROM YourTable
WHERE LEFT(PromoID,6) IN
(
SELECT LEFT(PromoID,6) 
FROM YourTable 
Group By LEFT(PromoID, 6)
HAVING COUNT(*) > 1
)

フィドルのデモ

于 2013-07-15T16:41:18.867 に答える
0

内部クエリは、拒否するすべての PromoID をリストします。外側のクエリは、拒否されたものを除いたすべての PromoID を取ります。

SELECT *
  FROM table1
 WHERE PromoID not in (
    SELECT t1.PromoID
      FROM table1 t1
    LEFT JOIN table1 t2 ON t1.PromoID != t2.PromoID
          AND left(t1.PromoID, 6) = left(t2.PromoID, 6)
     WHERE t2.PromoID IS NULL
 )

SQL フィドル

于 2013-07-15T16:42:05.467 に答える
0

共通テーブル式を使用してこれを行うことができます。

WITH CTE (Prefix) AS
  (select LEFT(PromoId, 6) from Foo GROUP BY LEFT(PromoId, 6) HAVING COUNT(1) > 1)
SELECT PromoId FROM Foo
INNER JOIN CTE ON LEFT(PromoId, 6) = CTE.Prefix;

フィドル

于 2013-07-15T16:30:13.140 に答える