SQL-запрос: Моделирование “И” по нескольким строкам вместо подзапросов

Существует способ с использованием модуля traceback, который извлекает информацию о трассировке:

import traceback
import sys

try:
    def func():
        raise TypeError:
    func()
except TypeError:
    e = sys.exc_info()[2]
    print(traceback.extract_tb(e)[0][3])

, который печатает

func()

Посмотрите на полный вывод traceback.extract_tb(e) как он дает список кортежей для каждого уровня в стеке вызовов. Каждый из них содержит (file, line_no, module_or_func, line_text), и вы можете изменить, какие значения вы используете. В этом примере я использовал line_text снизу стека (первое, что нужно вызвать).

10
задан Max Cantor 3 October 2008 в 14:59
поделиться

5 ответов

SELECT contentID
FROM tags
WHERE tagID in (334, 338, 342)
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = 3


--In general
SELECT contentID
FROM tags
WHERE tagID in (...) --taglist
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = ... --tagcount
24
ответ дан 3 December 2019 в 16:11
поделиться

Вот решение, которое работало намного быстрее, чем для меня на очень большой базе данных объектов и тегов. Это - пример для пересечения с тремя тегами. Это просто цепочки много соединений на таблице тега object (objtags) указать на тот же объект и предусматривает идентификаторы тега в WHERE пункт:

SELECT w0.objid

FROM       objtags t0
INNER JOIN objtags t1 ON t1.objid=t0.objid
INNER JOIN objtags t2 ON t2.objid=t1.objid

WHERE t0.tagid=512
  AND t1.tagid=256
  AND t2.tagid=128

Я понятия не имею, почему это работает быстрее. Это было вдохновлено поисковым кодом в сервере MusicBrainz. Делая это в Пост-ГРЭС, я обычно заканчиваю ~8-10x ускорение HAVING COUNT(...) решение.

2
ответ дан 3 December 2019 в 16:11
поделиться

Единственным альтернативным путем я могу думать:

select a.contentid from tags a
inner join tags b on a.contentid = b.contentid and b.tagid=334
inner join tags c on a.contentid = c.contentid and c.tagid=342
where a.tagid=338
1
ответ дан 3 December 2019 в 16:11
поделиться

Я не знаю, лучше ли это, но это могло бы быть более удобно в сопровождении

select contentid from tags where tagid = 334
intersect
select contentid from tags where tagid = 338
intersect
select contentid from tags where tagid = 342

Необходимо было бы создать его динамично, который не будет так же плох как исходное решение.

0
ответ дан 3 December 2019 в 16:11
поделиться

Какой SQL? SQL Server MS, Oracle, MySQL?

В SQL Server не делает это приравнивается к:

select contentid from tags where tagid IN (334,338,342)
-1
ответ дан 3 December 2019 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: