ما هو عبارة SQL لتحديد عنصر يحتوي على العديد من السمات في قائمة عنصر / سمة؟
-
06-09-2019 - |
سؤال
قل لدي طاولة لديها عناصر وسمات مدرجة مثل،
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.
لم يسبق له مثيل قاعدة بيانات حتى الآن استخدم هذا النموذج الذي لم يدرك إلى مشكلات أداء خطيرة في نهاية المطاف. يبدو هذا التصميم أنيقا للأشخاص غير قاعدة البيانات ولكنهم في الواقع علامة على قاعدة بيانات مصممة بشكل سيء.