1つの列DISTINCT SQLを選択します
-
05-07-2019 - |
質問
追加: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
これはあなたが探しているものですか?
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は、テキストおよび数値以外のいくつかのデータ型で機能することに注意してください。