Как написать SQL для комбинации AND? - PullRequest
0 голосов
/ 27 июня 2018

Пожалуйста, проверьте прилагаемую таблицу.

enter image description here

Мне нужно написать запрос, чтобы получить документы, которые имеют tage_id, скажем, 32 и 26.

Что-то вроде select * from doc_tags where tag_id = 32 or tag_id = 26 не сработает, так как я получу оба документа с 32, 26 и (32, 26).

Мне нужны документы, которые имеют только тэг с идентификатором 32 ** и 26, а не отдельные. **

Примечание Я не могу использовать document_id в качестве ссылки.

Ответы [ 9 ]

0 голосов
/ 27 июня 2018

Если это будет только между 2 документами, вы можете сделать это

Select * 
from doc_tags a
join doc_tags b on a.document_id = b.document_id
where a.tag_id = 26 and b.tag_id = 32
0 голосов
/ 27 июня 2018

Вы также можете использовать функцию min()/max():

SELECT document_id
FROM doc_tags dt
WHERE tag_id IN (26, 32)
GROUP BY document_id
HAVING MIN(tag_id) <> MAX(tag_id);
0 голосов
/ 27 июня 2018
SELECT * FROM doc_tags WHERE tag_id = 32 and tag_id = 26 

Выше вернутся только теги 32 и 26

0 голосов
/ 27 июня 2018
SELECT
  d1.*
FROM
  doc_tags AS d1
INNER JOIN
  doc_tags AS d2
ON
  d1.documentid = d2.documentid AND
  (
    d1.documentid = 26 AND d2.documentid = 32 OR
    d1.documentid = 32 AND d2.documentid = 26
  )
WHERE
  d1.id <> d2.id
0 голосов
/ 27 июня 2018

Я бы посчитал количество различных тегов, которые документ имеет между этими двумя:

SELECT   document_id
FROM     doc_tags
WHERE    tag_id IN (26, 32)
GROUP BY document_id
HAVING   COUNT(DISTINCT tag_id) = 2
0 голосов
/ 27 июня 2018
DECLARE @RESULT TABLE(doc_name VARCHAR(255))

INSERT INTO @RESULT 
       SELECT document_id 
       from doc_tags 
       WHERE tag_id =26 AND document_id IN 
            (SELECT document_id 
             from #tmp 
             WHERE tag_id =32)

SELECT * 
FROM doc_tags 
WHERE document_id in (SELECT doc_name 
                      FROM @RESULT)
0 голосов
/ 27 июня 2018
select * from doc_tags dt1
where (
    select count(distinct tag_id) from doc_tags dt2
    where dt2.document_id = dt1.document_id and tag_id in (26, 32)
) = 2 and dt1.tag_id in (26, 32)

или

with data as (
    select *,
        count(distinct tag_id) over (partition by document_id) as matches
    from doc_tags where tag_id in (26, 32)
)
select * from data where matches = 2
0 голосов
/ 27 июня 2018

Попробуйте этот тип SQL QUUERY

select * from doc_tags where tag_id IN (32,26)
0 голосов
/ 27 июня 2018
select * from doc_tags where tag_id not in (32, 26)
...