Tôi có một bảng tài liệu và một bảng thẻ. Các tài liệu được gắn thẻ với các giá trị khác nhau.Chọn từ Bảng A nơi nó tham gia vào tất cả dữ liệu trong Bảng B
Tôi đang cố gắng tạo một tìm kiếm các thẻ này và phần lớn thẻ đang hoạt động. Tuy nhiên, tôi nhận được kết quả bổ sung khi nó khớp với bất kỳ thẻ nào. Tôi chỉ muốn kết quả mà nó phù hợp với tất cả các thẻ.
Tôi đã tạo ra này để minh họa cho vấn đề http://sqlfiddle.com/#!3/8b98e/11
Bàn dữ liệu:
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');
Code:
-- 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
(Lưu ý tôi không phải là một DBA, vì vậy có thể có cách làm tốt hơn, hy vọng tôi đi đúng hướng, nhưng tôi m mở cho các đề xuất khác nếu việc triển khai của tôi có thể được cải thiện.)
Có ai có thể đưa ra bất kỳ đề xuất nào về cách chỉ nhận được kết quả có tất cả các thẻ không?
Rất cám ơn.
Nếu bạn có mã ứng dụng như coldfusion, .net, php, v.v., sẽ dễ sử dụng hơn. –
Vấn đề này được gọi là phân chia quan hệ. –