استعلام SQL يعطي نتائج مميزة تتطابق مع أعمدة متعددة

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

  •  05-07-2019
  •  | 
  •  

سؤال

عذرًا، لم أتمكن من تقديم عنوان أفضل لمشكلتي لأنني جديد تمامًا على 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

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