14

追加: SQL Server 2000 と 2005 で作業しているため、両方で作業する必要があります。また、value_rk は数値/整数ではありません (エラー: オペランド データ型の uniqueidentifier は min 演算子に対して無効です)

返された他の列を気にしない場合に、単一列の「DISTINCT」一致を行う方法はありますか? 例:

**Table**
Value A, Value L, Value P
Value A, Value Q, Value Z

最初の行 (値 A) に基づいて、これらの行の 1 つだけを返す必要があります。2 列目と 3 列目の結果が必要です (2 列目は実際には全体的に一致するはずですが、3 列目は一意のキーであり、少なくとも 1 つ必要です)。

明らかに機能しませんが、これまでのところ私が持っているものは次のとおりです。

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value IN (
    SELECT value, max(value_rk)
    FROM attribute_values
)
ORDER BY attribute_definition_id

私は ColdFusion で作業しているので、簡単な回避策があれば、それも受け入れます。最初の列「値」を制限または「グループ化」しようとしています。すべての値が一意であるため、value_rk は私の大きな問題ですが、必要なのは 1 つだけです。

注: value_rk は数値ではないため、これは機能しません

更新: 動作するバージョンがあります。おそらく、純粋な SQL バージョンよりもかなり遅いですが、正直なところ、この時点で動作するものは何もないよりはましです。最初のクエリの結果を取得し、結果を 1 つに制限することを除いて 2 番目のクエリを実行し、一致する値に一致する value_rk を取得します。そのようです:

<cfquery name="queryBaseValues" datasource="XXX" timeout="999">
    SELECT DISTINCT value, attribute_definition_id
    FROM attribute_values
    ORDER BY attribute_definition_id
</cfquery>

<cfoutput query="queryBaseValues">
    <cfquery name="queryRKValue" datasource="XXX">
        SELECT TOP 1 value_rk
        FROM attribute_values
        WHERE value = '#queryBaseValues.value#'
    </cfquery>
    <cfset resourceKey = queryRKValue.value_rk>
    ...

これで、ColdFusion で 1 つの列を明確に選択することができました。純粋な SQL Server 2000/2005 の提案は大歓迎です :)

4

11 に答える 11

11

これはうまくいくかもしれません:

SELECT DISTINCT a.value, a.attribute_definition_id, 
  (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

.. 未検証。

于 2008-10-30T21:32:46.813 に答える
9
SELECT a1.value, a1.attribute_definition_id, a1.value_rk
FROM attribute_values AS a1
  LEFT OUTER JOIN attribute_values AS a2
    ON (a1.value = a2.value AND a1.value_rk < a2.value_rk)
WHERE a2.value IS NULL
ORDER BY a1.attribute_definition_id;

言い換えれば、同じ以上の を持つ行が存在しa1ない行を見つけます。a2valuevalue_rk

于 2008-10-30T18:51:55.640 に答える
8

これは PostgreSQL で動作するはずです。どの dbms を使用しているかわかりません。

SELECT DISTINCT ON (value)
  value, 
  attribute_definition_id, 
  value_rk
FROM 
  attribute_values
ORDER BY
  value, 
  attribute_definition_id

PostgreSQL ドキュメント

于 2008-10-30T18:56:23.273 に答える
2

テーブル変数の使用に慣れている場合は、次のように単一のデータベース呼び出し内にすべてを保持できます。

DECLARE @attribute_values TABLE (value int, attribute_definition_id int, value_rk uniqueidentifier)

INSERT INTO @attribute_values (value)
SELECT DISTINCT value FROM attribute_values

UPDATE @attribute_values
SET attribute_definition_id = av2.attribute_definition_id,
    value_rk = av2.value_rk
FROM @attribute_values av1
INNER JOIN attribute_values av2 ON av1.value = av2.value

SELECT value, attribute_definition_id, value_rk FROM @attribute_values

基本的に、「値」の一意の値で満たされたテーブルで制限されたレコードセットを作成し、メイン テーブルからの一致の 1 つだけを使用して SQL Server にギャップを埋めさせます。

編集して追加: この構文は cfquery 内で問題なく機能します。

于 2008-11-05T22:15:37.687 に答える
2

さて、ここに私の仮定があります:

標準 SQL サーバー

value_rk は数値ではありませんが、value と attribute_definition_id数値です。

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk
ORDER BY MIN(attribute_definition_id)

これらのフィールドのいずれかが数値でない場合は、さらに検討する必要があります。お知らせください。

于 2008-10-30T19:12:05.490 に答える
2

これはあなたが探しているものですか?

SELECT value, attribute_definition_id, value_rk
FROM attribute_values av1
WHERE value_rk IN (
        SELECT max(value_rk)
        FROM attribute_values av2
        WHERE av2.value = av1.value
)
ORDER BY attribute_definition_id

value_rk が一意の場合、これは機能するはずです。

于 2008-10-30T18:49:32.803 に答える
1

あなたの設定を完全に理解しているかどうかはわかりませんが、次のように機能します。

SELECT value, attribute_definition_id, value_rk
FROM attribute_values
GROUP BY value
ORDER BY attribute_definition_id;

繰り返しますが、どの列を制限しようとしているのか、またはどのように制限したいのかわかりません。

于 2008-10-30T18:55:29.487 に答える
1
SELECT value, attribute_definition_id, value_rk
FROM attribute_values
WHERE value, value_rk IN (
        SELECT value, max(value_rk)
        FROM attribute_values
        GROUP BY value
)
ORDER BY attribute_definition_id

未検証!

于 2008-10-30T18:47:15.757 に答える
0

私が望むほどエレガントではありません----それは本質的にあなたがしていることであり、純粋なSQLだけです---しかしそれは機能し、すべてSQLで行うことができます。

DECLARE @mytable TABLE(mykey NVARCHAR(512)、myVal NVARCHAR(512))

DECLARE @keyVal NVARCHAR(512)
DECLARE @depVal NVARCHAR(512)
myCursorCURSORを宣言します
   SELECT DISTINCT(value)FROM attribute_values
myCursorを開く
myCursorから@keyValへの次のフェッチ
WHILE @@ FETCH_STATUS = 0
  始める
     SET @depVal =(SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE VALUE = @ keyVal ORDER BY attribute_definition_id)
     INSERT INTO @mytable(mykey、myVal)VALUES(@ keyVal、@depVal)
     myCursorから@keyValへの次のフェッチ
  終わり
myCursorの割り当てを解除する

SELECT * FROM @mytable

このメソッドを使用して、depVal2などを追加できます。

于 2008-10-30T20:04:51.030 に答える
0

John Fiala が指摘したように、SQL サーバーの標準的な答えは、列のサブセットに対して「個別の」操作を実行する場合に group by 句を使用することです。なぜこれが正しい標準的な答えなのですか? さて、「個別」グループの一部ではない列を取り込みたいとします。これらの補助列に正確にどの行を取り込みたいですか? group by 句を使用し、これらの補助列に対して集計関数を定義すると、これらの補助列がどのように取得されるかがわかったという意味で、クエリの動作が適切になります。詳細については、次の記事を参照してください。

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx

SELECT value_rk, MIN(value) as value, 
MIN(attribute_definition_id) as attribute_definition_id
FROM attribute_values
GROUP BY value_rk

また、MIN と MAX は、テキストや、数値以外の他のいくつかのデータ型で機能することに注意してください。

于 2012-08-31T18:58:28.230 に答える
0

おもう

SELECT DISTINCT a.value, a.attribute_definition_id, 
(SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk
FROM attribute_values as a
ORDER BY attribute_definition_id

働いた

于 2012-01-06T10:52:20.843 に答える