استعلام SQL يعطي نتائج مميزة تتطابق مع أعمدة متعددة
سؤال
عذرًا، لم أتمكن من تقديم عنوان أفضل لمشكلتي لأنني جديد تمامًا على SQL.أنا أبحث عن سلسلة استعلام SQL تحل المشكلة أدناه.
لنفترض الجدول التالي:
DOCUMENT_ID | TAG ---------------------------- 1 | tag1 1 | tag2 1 | tag3 2 | tag2 3 | tag1 3 | tag2 4 | tag1 5 | tag3
أريد الآن تحديد جميع معرفات المستندات المميزة التي تحتوي على علامة واحدة أو أكثر (ولكن يجب أن توفر جميع العلامات المحددة).على سبيل المثال:حدد جميع معرفات document_id التي تحتوي على العلامة 1 وسيقوم tag2 بإرجاع 1 و3 (ولكن ليس 4 على سبيل المثال لأنه لا يحتوي على العلامة 2).
ما هي أفضل طريقة لفعل ذلك؟
التحيات ، كاي
المحلول
SELECT document_id
FROM table
WHERE tag = 'tag1' OR tag = 'tag2'
GROUP BY document_id
HAVING COUNT(DISTINCT tag) = 2
تحرير:
والمحدث لعدم وجود قيود ...
نصائح أخرى
يفترض هذا أن DocumentID والعلامة هما المفتاح الأساسي.
يحرر:تم تغيير جملة HAVING لحساب العلامات المميزة.بهذه الطريقة لا يهم ما هو المفتاح الأساسي.
بيانات الاختبار
-- Populate Test Data
CREATE TABLE #table (
DocumentID varchar(8) NOT NULL,
Tag varchar(8) NOT NULL
)
INSERT INTO #table VALUES ('1','tag1')
INSERT INTO #table VALUES ('1','tag2')
INSERT INTO #table VALUES ('1','tag3')
INSERT INTO #table VALUES ('2','tag2')
INSERT INTO #table VALUES ('3','tag1')
INSERT INTO #table VALUES ('3','tag2')
INSERT INTO #table VALUES ('4','tag1')
INSERT INTO #table VALUES ('5','tag3')
INSERT INTO #table VALUES ('3','tag2') -- Edit: test duplicate tags
استفسار
-- Return Results
SELECT DocumentID FROM #table
WHERE Tag IN ('tag1','tag2')
GROUP BY DocumentID
HAVING COUNT(DISTINCT Tag) = 2
نتائج
DocumentID
----------
1
3
select DOCUMENT_ID
TAG in ("tag1", "tag2", ... "tagN")
group by DOCUMENT_ID
having count(*) > N and
وضبط N وقائمة البطاقات حسب الحاجة.
Select distinct document_id
from {TABLE}
where tag in ('tag1','tag2')
group by id
having count(tag) >=2
وكيف يمكنك إنشاء قائمة من العلامات في بند حيث يعتمد على بنية التطبيق الخاص بك. إذا كنت توليد الاستعلام حيوي كجزء من التعليمات البرمجية الخاصة بك فإنك قد ببساطة بناء الاستعلام كسلسلة كبيرة ديناميكيا.
وكنا دائما الإجراءات المخزنة الاستعلام عن البيانات. في هذه الحالة، نحن نمر في قائمة العلامات في وثيقة XML. - إجراء من هذا القبيل قد تبدو شيء من هذا القبيل واحدة من هذه حيث وسيطة الإدخال ستكون
<tags>
<tag>tag1</tag>
<tag>tag2</tag>
</tags>
CREATE PROCEDURE [dbo].[GetDocumentIdsByTag]
@tagList xml
AS
BEGIN
declare @tagCount int
select @tagCount = count(distinct *) from @tagList.nodes('tags/tag') R(tags)
SELECT DISTINCT documentid
FROM {TABLE}
JOIN @tagList.nodes('tags/tag') R(tags) ON {TABLE}.tag = tags.value('.','varchar(20)')
group by id
having count(distict tag) >= @tagCount
END
وOR
CREATE PROCEDURE [dbo].[GetDocumentIdsByTag]
@tagList xml
AS
BEGIN
declare @tagCount int
select @tagCount = count(*) from @tagList.nodes('tags/tag') R(tags)
SELECT DISTINCT documentid
FROM {TABLE}
WHERE tag in
(
SELECT tags.value('.','varchar(20)')
FROM @tagList.nodes('tags/tag') R(tags)
}
group by id
having count( distinct tag) >= @tagCount
END
وEND