1

少なくとも一意の userId のみを返す必要がある select ステートメントがあります。これが発生せず、userIds が 2 倍の場合、ユーザーは何か不正なものを入力しました。

説明するために、単純な を使用しSELECT userId, name, FROM USERます。ここで、通常、テーブル レベルで userId を一意/主キーにします。例のために、私たちはしません。

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

userId    name
---------------
1         Roel
2         Joe
3         John

しかし、結果は次のようになります

userId    name
---------------
1         Roel
1         Roel
2         Joe
3         John
3         John

結果に複数の userId が含まれている場合にエラーが発生するような方法でクエリを作成する可能性はありますか?

4

4 に答える 4

1
SELECT 
    UserId, COUNT(*)
FROM 
    User
GROUP BY
    UserId
HAVING 
   COUNT(*) > 1

これから返されるレコードは、誤ったデータがあるレコードになります。これは、いつエラーを発生させるかを特定する最も簡単な方法ですが、単純にエラーを発生させるわけではありません。上記のクエリをプロシージャにラップし、いくつかのロジックを使用して、エラーを発生させるかメイン クエリを実行するかを決定できます。

于 2012-09-05T08:59:22.230 に答える
1

追加するだけDISTINCTです。そして、それはあなたの行をユニークにします。

SELECT DISTINCT userId, name 
FROM USER

定義上、DISTINCTキーワードを使用して、個別の (異なる) 値のみを返すことができます。

更新 1

その理由は、テーブルに制約を指定しなかったためです。このようなテーブル定義を作成します。

CREATE TABLE userList
(
    ID INT NOT NULL AUTO_INCREMENT,
    NAME VARCHAR(50) NOT NULL,
    CONSTRAINT id_PK PRIMARY (ID),
    CONSTRAINT name_unique UNIQUE (NAME)
)

IDauto_incremented にしたくない場合はAUTO_INCREMENT、テーブル定義の単語を削除するか、このようなテーブル定義を作成できます

CREATE TABLE userList
(
    ID INT NOT NULL,
    NAME VARCHAR(50) NOT NULL,
    CONSTRAINT id_PK PRIMARY (ID),
    CONSTRAINT name_unique UNIQUE (ID, NAME)
)
于 2012-09-05T09:04:13.913 に答える
0

別の解決策は

SELECT *
FROM User
UNION
SELECT *
FROM User

この利点は、SELECT で変数をリストする必要がないことです。通常、列名を明示的に書かないのは悪いことですが、このケースはそれが理にかなっているまれなケースの 1 つだと思います。

于 2015-01-19T17:26:43.023 に答える
0

まあ、これは登録時に重要だと思います...そのため、INSERT を許可する前に、特定のユーザー名のヒットを count() するだけです。

次に、name列をUNIQUEにすると、INSERT時に正しいエラーが発生します

于 2012-09-05T09:08:56.553 に答える