LINUX.ORG.RU

Как составить запрос

 


0

1

Есть таблица, отображающая отношение многие ко многим.

[id1][id2]
1 1
1 2
1 3
2 2
2 3
2 4
3 1
3 3
3 5

Как все получить все id1, которые связаны, как минимум, с определенным набором id2?

Например, если я хочу получить все id1, которые связаны, как минимум, с [2, 3], то я должен получить [1, 2].

Как такое сделать на языке SQL?

★★

Ничего не понял из ваших объяснений. Как из вашей таблицы в посте следует, что при выборке по набору значений id2 = [2, 3] должна получиться выборка [1, 2]?

delete83 ★★
()
Ответ на: комментарий от delete83

Как все получить все id1, которые связаны, как минимум, с определенным набором id2?

Дано:

таблица + id2_list размерностью N

Это означает: как получить все id1, для которых имеются строки вида

id1, id2_list[0]
id1, id2_list[1]
...
id1, id2_list[N-1]
bk_ ★★
() автор топика
Ответ на: комментарий от aol

where id2 in (val1, val2, valN);

А это на означает, что id2 либо равен val1, либо val2 ... либо valN? Если не равен ничему из списка - то не селектится?

bk_ ★★
() автор топика
select id1 from <table name> where id2 in (здесь список значений id2 через запятую)
xterro ★★★★★
()
Ответ на: комментарий от bk_

можешь так же, подзапрос всунуть, если субд поддерживает:

... where id2 in (select id from any_table where <condition>)

подзапрос должен возвращать список ид-ов

aol ★★★★★
()

Спасибо.

bk_ ★★
() автор топика
Ответ на: комментарий от delete83

Нет, повторяться они не должны, но могут. Я пока не знаю, как сделать так, чтобы при insert оно само проверяло, естьли такая же строка уже в таблице.

Такое, кстати, можно сделать атомарно, без select и инсертов?

bk_ ★★
() автор топика
Ответ на: комментарий от delete83

Если пары (id1, id2) уникальны, то у меня получился вот такой код:

select
	id1
from
	(select
		id1, count(id1) cc
	from
		t
	where
		id2 in (2, 3)
	group by
		id1
	) t
where
	cc = 2
К сожалению, обойтись одним запросом не получилось. Может спецы и знают как, а у меня знаний не хватает.

delete83 ★★
()
Ответ на: комментарий от bk_

Если повторяться могут, но не должны то входную таблицу можно сначала подвергнуть группировке по двум полям: (id1, id2). Тогда пары станут уникальны.

delete83 ★★
()
Ответ на: комментарий от delete83

Сорри, вместо «in (2, 3)» следует читать «in (val1, val2, ..., valN)», а вместо «cc= 2» следует читать «cc = N»

delete83 ★★
()
Ответ на: комментарий от bk_

Я пока не знаю, как сделать так, чтобы при insert оно само проверяло, естьли такая же строка уже в таблице.

UNIQUE INDEX на (id1,id2)

Sectoid ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.