سؤال

تمت الإضافة:العمل مع SQL Server 2000 و2005، يجب أن يعمل على كليهما.كما أن value_rk ليس رقمًا/عددًا صحيحًا (خطأ:المعرف الفريد لنوع بيانات المعامل غير صالح لمشغل الحد الأدنى)

هل هناك طريقة لإجراء مطابقة عمود واحد "متميز" عندما لا أهتم بالأعمدة الأخرى التي يتم إرجاعها؟مثال:

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

أحتاج إلى إرجاع صف واحد فقط من هذه الصفوف بناءً على ما هو موجود في الصف الأول (القيمة أ).ما زلت بحاجة إلى نتائج من العمودين الثاني والثالث (يجب أن يتطابق العمود الثاني فعليًا مع جميع المجالات على أي حال، لكن الثالث عبارة عن مفتاح فريد، وأحتاج إلى واحد منه على الأقل).

إليك ما حصلت عليه حتى الآن، على الرغم من أنه لا يعمل بشكل واضح:

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 هي مشكلتي الكبيرة لأن كل قيمة فريدة من نوعها ولكني أحتاج إلى واحدة فقط.

ملحوظة:value_rk ليس رقمًا، وبالتالي لا يعمل هذا

تحديث:لدي نسخة صالحة للعمل، وربما تكون أبطأ قليلاً من إصدار SQL النقي، ولكن بصراحة أي شيء يعمل في هذه المرحلة أفضل من لا شيء.فهو يأخذ النتائج من الاستعلام الأول، ويقوم باستعلام ثانٍ باستثناء قصر نتائجه على استعلام واحد، ويحصل على 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;

وبعبارة أخرى، والعثور على a1 الصف الذي يوجد أي a2 خلاف مع نفسه value وvalue_rk أكبر.

وهذا يجب أن تعمل لشبكة الإنترنت، وأنا لا أعرف أي نظم إدارة قواعد البيانات التي تستخدمها.

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 ليس قيمة رقمية، ولكن قيمة و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

وأساسا كنت تقوم بإنشاء سجلات محدود مع الجدول مليئة القيم الفريدة من "القيمة"، والسماح SQL خادم ملء الثغرات في استخدام واحد فقط من المباريات من الجدول الرئيسي.

وقام لإضافة: بناء الجملة هذا يعمل ضمن 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

وعملت

وكما لاحظ جون فيالا، فإن الجواب الكنسي في خادم SQL هو استخدام مجموعة من شرط عندما تريد إجراء عملية "متميزة" على مجموعة فرعية من الأعمدة. لماذا هذا الجواب الكنسي الصحيحة؟ حسنا، أنت تريد سحب في الأعمدة التي ليست جزءا من مجموعتك "متميزة". بالضبط ما الصفوف هل تريد سحب في هذه الأعمدة الفرعية؟ باستخدام مجموعة من بند وتحديد وظائف الكلي لهذه الأعمدة الفرعية يجعل الاستعلام الخاص بك تصرفت بشكل جيد بمعنى أن تعرف الآن كيف يتم الحصول على هذه الأعمدة الفرعية. وهذه المادة تعطي المزيد من التفاصيل:

HTTP: // المدونات. 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