6

ドキュメントのテーブルとタグのテーブルがあります。ドキュメントは、さまざまな値でタグ付けされています。

これらのタグの検索を作成しようとしていますが、ほとんどの場合は機能しています。ただし、タグに一致すると余分な結果が返されます。すべてのタグに一致する結果のみが必要です。

問題を説明するためにこれを作成しましたhttp://sqlfiddle.com/#!3/8b98e/11

テーブルとデータ:

CREATE TABLE Documents
(
 DocId INT,
 DocText VARCHAR(500)
);

CREATE TABLE Tags
(
  TagId INT,
  TagName VARCHAR(50)
);

CREATE TABLE DocumentTags
(
  DocTagId INT,
  DocId INT,
  TagId INT,
  Value VARCHAR(50)
);

INSERT INTO Documents VALUES (1, 'Document 1 Text');
INSERT INTO Documents VALUES (2, 'Document 2 Text');

INSERT INTO Tags VALUES (1, 'Tag Name 1');
INSERT INTO Tags VALUES (2, 'Tag Name 2');

INSERT INTO DocumentTags VALUES (1, 1, 1, 'Value 1');
INSERT INTO DocumentTags VALUES (1, 1, 2, 'Value 2');
INSERT INTO DocumentTags VALUES (1, 2, 1, 'Value 1');

コード:

-- Set up the parameters
DECLARE @TagXml VARCHAR(max)
SET @TagXml = '<tags>
                  <tag>
                    <description>Tag Name 1</description>
                    <value>Value 1</value>
                  </tag>
                  <tag>
                    <description>Tag Name 2</description>
                    <value>Value 2</value>
                  </tag>
                </tags>'

-- Create a table to store the parsed xml in
DECLARE @XmlTagData TABLE 
(
    id varchar(20)
    ,[description] varchar(100)
    ,value varchar(250)
)

-- Populate our XML table
DECLARE @iTag int
EXEC sp_xml_preparedocument @iTag OUTPUT, @TagXml
-- Execute a SELECT statement that uses the OPENXML rowset provider
-- to produce a table from our xml structure and insert it into our temp table
INSERT INTO @XmlTagData (id, [description], value)
SELECT  id, [description], value
FROM    OPENXML (@iTag, '/tags/tag',1)
        WITH (id varchar(20),
                [description] varchar(100) 'description',
                value varchar(250) 'value')

EXECUTE sp_xml_removedocument @iTag

-- Update the XML table Id's to match existsing Tag Id's
UPDATE      @XmlTagData
SET         X.Id = T.TagId
FROM        @XmlTagData X
INNER JOIN  Tags T ON X.[description] = T.TagName

-- Check it looks right
--SELECT * 
--FROM @XmlTagData

-- This is where things do not quite work. I get both doc 1 & 2 back, 
-- but what I want is just document 1.
-- i.e. documents that have both tags with matching values
SELECT DISTINCT D.*
FROM Documents D
INNER JOIN DocumentTags T ON T.DocId = D.DocId
INNER JOIN @XmlTagData X ON X.id = T.TagId AND X.value = T.Value

(私は DBA ではないので、もっと良い方法があるかもしれません。うまくいけば、私は正しい方向に進んでいますが、私の実装を改善できる場合は、他の提案を受け入れます。)

すべてのタグを持つ結果のみを取得する方法について、誰か提案できますか?

どうもありがとう。

4

3 に答える 3

0

の構文はよくわかりませんが、SQL Serverこのようなものが機能するはずです

SELECT d.docId
FROM Documents D
INNER JOIN DocumentTags T ON T.DocId = D.DocId
INNER JOIN @XmlTagData X ON X.id = T.TagId AND X.value = T.Value
group by 
documents.docid
having count(*) = 2 --[total of tags to be searched]
于 2013-05-13T16:22:29.663 に答える