質問

追加: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で単一の列を明確に選択できました。純粋なSQL Server 2000/2005の提案は大歓迎です:)

役に立ちましたか?

解決

これは動作する可能性があります:

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

..テストされていません。

他のヒント

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;

つまり、同じ value とより大きい value_rk <を持つ行 a2 が存在しない行 a1 を見つけます。 / code>。

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

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

PostgreSQLドキュメント

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

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が一意であれば、これは機能するはずです。

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

標準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)

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

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

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

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

追加して編集:この構文はcfquery内で正常に機能します。

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

テストされていません!

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

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

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

私が望むよりもエレガントではありません----それは基本的にあなたがしていることです、純粋なSQLでのみです---しかしそれは動作し、すべてSQLで行うことができます。

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

DECLARE @keyVal NVARCHAR(512)
DECLARE @depVal NVARCHAR(512)
DECLARE myCursor CURSOR for
   SELECT DISTINCT(value) FROM attribute_values
OPEN myCursor
FETCH NEXT FROM myCursor INTO @keyVal
WHILE @@FETCH_STATUS=0
  BEGIN
     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)
     FETCH NEXT FROM myCursor INTO @keyVal
  END
DEALLOCATE myCursor

SELECT * FROM @mytable

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

私は考える

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

作業済み

John Fialaが指摘したように、SQLサーバーの標準的な答えは、「distinct」を実行する場合に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は、テキストおよび数値以外のいくつかのデータ型で機能することに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top