ما هو عبارة SQL لتحديد عنصر يحتوي على العديد من السمات في قائمة عنصر / سمة؟

StackOverflow https://stackoverflow.com/questions/927724

سؤال

قل لدي طاولة لديها عناصر وسمات مدرجة مثل،

frog    green
cat     furry
frog    nice
cat     4 legs
frog    4 legs

من عمود العناصر، أرغب في تحديد كائنات فريدة تحتوي على سمة كل من اللون الأخضر والأرجل. أتوقع العودة فقط كائن الضفدع في هذه الحالة. ما هو الاستعلام الأكثر كفاءة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

select  item.name 
from    item 
where   item.attribute in ('4 legs', 'green') 
group by item.name 
having  count(distinct item.attribute) = 2

نصائح أخرى

الطريقة الأكثر كفاءة للقيام بذلك هي مع الانضمام الذاتي:

SELECT * FROM attributes a1 
JOIN attributes a2 USING (item_name) -- e.g. frog
WHERE a1.value = 'green' AND a2.value = '4 legs';

حل آخر أن بعض الناس يستخدمون خدعة مع مجموعة من قبل:

SELECT item_name FROM attributes
WHERE value IN ('4 legs', 'green')
GROUP BY item_name
HAVING COUNT(*) = 2;

لكن المجموعة حسب الحل قد لا تكون فعالة كضمان، اعتمادا على العلامة التجارية التي تستخدمها RDBMS. أيضا طريقة واحدة قد تكون أفضل كما ينمو حجم الصوت في الجدول الخاص بك.

حدد * من الجدول حيث الشيء = "الضفدع"

لا شيء يدق معرفة exatcly ما تريد.

select
    item, count(*)
from
    @temp
where
    attribute in ('4 legs','green')
group by
    item
having
    count(*) = 2 -- this "2" needs to be replaced with however many attributes you have

يمكنك أيضا الاستعلام عن كل سمة بشكل منفصل، ثم تتقاطعها ...

/*
-- create sample table...
create table #temp1
    (item varchar(max),
    attrib varchar(max))

-- populate sample table (SQL 08)...
insert #temp1
values ('frog', 'green'), ('cat', 'furry'), ('frog', 'nice'), ('cat', '4 legs'), ('frog', '4 legs')
*/


SELECT  item
FROM    #temp1
WHERE   attrib = 'green'
INTERSECT
SELECT  item
FROM    #temp1
WHERE   attrib = '4 legs'

قم بإنشاء طاولتين، أحد العناصر واحدا من السمات.
يمكن أن تكون العناصر الاسم، Intattributeid، حيث INTATTRIBIDED هو مرجع أساسي أجنبي إلى جدول السمات. بهذه الطريقة يمكنك القيام ببيان محدد بناء على ما تهتم به.

ولكن ربما هذا يمكن أن يساعدك:

SELECT * 
FROM tbl t1
INNER JOIN tbl t2 ON t1.Name = t2.Name
WHERE t1.Attribute = 'green' AND t2.Attribute = '4 legs'

من الصعب لأنه ليس نموذج طبيعي. إنها عطلة نهاية أسبوع.

أنت تصف تصفية عبر صفوف متعددة غير متصلة، لذلك يجب عليك استخراج كل سمة بدوره ثم تطابق العناصر.

SELECT
   item
FROM
    (SELECT
        item
    FROM
        Mytable
    WHERE
        attribute = '4 legs') k1
    JOIN
    (SELECT
        item
    FROM
        Mytable
    WHERE
        attribute = 'green') k2 ON k1.item = k2.item

إذا كان ذلك ممكنا، وأود أن إعادة تصميم. هذا ليس شيئا ستتمكن من الاستحوا إليه بشكل فعال 12 قيما في نفس الوقت (سيتطلب 12 ينضم)

يرجى قراءة هذا المادة ويكيبيدياhttp://en.wikipedia.org/wiki/entity-attribute-value_model#deides.

لم يسبق له مثيل قاعدة بيانات حتى الآن استخدم هذا النموذج الذي لم يدرك إلى مشكلات أداء خطيرة في نهاية المطاف. يبدو هذا التصميم أنيقا للأشخاص غير قاعدة البيانات ولكنهم في الواقع علامة على قاعدة بيانات مصممة بشكل سيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top