SQL Выберите, когда сгруппированная запись имеет несколько совпадающих строк - PullRequest
4 голосов
/ 30 августа 2011

У меня большой запрос, но моя самая большая проблема заключается в этой маленькой части.

ItemID является внешним ключом таблицы Master Item - он не уникален.Этот запрос не выполняет то, что я хочу (строка не может иметь все 4 имени), но он иллюстрирует то, что я ищу.

Select masteritemid from itemsgrouptable
where itemname like 'Item 1' 
And itemname like 'Item 2' 
And itemname like 'Item 3' 
And itemname like 'Item 4'

Я хочу получить itemid, только если 4 записи перечисленысуществовать с этим идентификатором.Мой текущий метод объединяет одну и ту же таблицу 4 раза на основе идентификатора, при этом каждый раздел просматривает 1 строку ... это ОЧЕНЬ неэффективно.

Ответы [ 3 ]

3 голосов
/ 30 августа 2011

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

select masteritemid from itemsgrouptable
where itemname regexp 'Item [1234].*'

Это будет соответствовать любому имени элемента, начинающемуся с "Item 1" или "Item 2" или "Item 3" или "Item 4"

1 голос
/ 30 августа 2011

Это появляется время от времени.Не так просто, как я ожидал.

Во-первых, не делайте утверждение "LIKE", если оно точно соответствует.Подобные операторы менее эффективны, чем прямое сравнение.

Во-вторых, вы можете выполнить то, что вы просите, в предложении GROUP BY / HAVING:

SELECT masteritemid FROM itemsgrouptable
GROUP BY masteritemid
HAVING COUNT(itemname) = 4
WHERE itemname IN ('Item 1','Item 2','Item 3','Item 4')

В основном вы группируете все свои элементы поmasteritemid и ограничение этого сгруппированного набора, в котором все 4 (или любое количество «item #» совпадают) находятся в указанном вами предложении «IN».Вид ловкого трюка.

0 голосов
/ 30 августа 2011

TRY

SELECT masteritemid FROM itemsgrouptable
WHERE itemname REGEXP '^Item[:digit]?+' 

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...