I am trying to get all key-value pairs from a document which you can search for with a list of key-value pairs yourself.
For this I create a temporary table and a SELECT
statement for each key-value pair provided like this:
DECLARE @DocMetaTemp TABLE
(
DocumentsID int,
DataKey varchar(255),
DataValue varchar(255)
);
INSERT INTO @DocMetaTemp
SELECT docMeta01.DocumentsID, docMeta01.DataKey, docMeta01.DataValue
FROM psp_doc.Documents as docs
INNER JOIN psp_doc.DocumentMetadata as docMeta01 ON docMeta01.DocumentsID = docs.ID
AND docMeta01.DataKey = 'testkey1'
AND docMeta01.DataValue = 'testval1';
INSERT INTO @DocMetaTemp
SELECT docMeta02.DocumentsID, docMeta02.DataKey, docMeta02.DataValue
FROM psp_doc.Documents as docs
INNER JOIN psp_doc.DocumentMetadata as docMeta02 ON docMeta02.DocumentsID = docs.ID
AND docMeta02.DataKey = 'testkey2'
AND docMeta02.DataValue = 'testval1';
select * from @DocMetaTemp
Which results in
but this looks very inefficent to me and also does not return the list of all key-value pairs that is assigned to the returned DocumentsIDs.
I tried to merge the query by adding the second INNER JOIN statement after the first one, but this results in an error as it does not seem to merge using the column names.
DECLARE @DocMetaTemp TABLE
(
DocumentsID int,
DataKey varchar(255),
DataValue varchar(255)
);
INSERT INTO @DocMetaTemp
SELECT docMeta01.DocumentsID, docMeta01.DataKey, docMeta01.DataValue, docMeta02.DocumentsID, docMeta02.DataKey, docMeta02.DataValue
FROM psp_doc.Documents as docs
INNER JOIN psp_doc.DocumentMetadata as docMeta01 ON docMeta01.DocumentsID = docs.ID and docMeta01.DataKey = 'testkey1' and docMeta01.DataValue = 'testval1'
INNER JOIN psp_doc.DocumentMetadata as docMeta02 ON docMeta02.DocumentsID = docs.ID and docMeta02.DataKey = 'testkey2' and docMeta02.DataValue = 'testval1';
select * from @DocMetaTemp
results in
Column name or number of supplied values does not match table definition.
How can I do this in a single statement? And how do I get all key-value pairs based on the IDs returned?