Я использую Firebird SQL в моем проекте C ++ (я новичок в SQL).
У меня есть таблица с двумя строками:
| aID | bID |
----------------
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 7 |
| 5 | 2 |
| 1 | 7 |
| ... | ... |
................
который aID и bID связаны как NxN (несколько к нескольким). (0 < помощь, заявка <= 10 ^ 6).
Теперь у меня есть набор bID (b0, b1, b2, … bK), где 0<= К <= 10 ^ 5.
Нужен уникальный набор AID, который связан с любым из би (0<= я <= К).
Я использую неоптимизированный способ (C ++):
std::vector<int> bIDs; // given bID's set.
std::set<int> aIDs; // result;
for(std::size_t ix = 0; ix < bIDs.size(); ++ix)
{
std::vector<int> localAIDs = m_SQLManager.getAIds(bIDs[ix]);
aIDs.insert( localAIDs.begin(), localAIDs.end() );
}
// where m_SQLManager.getAIDs use for given bi
//"SELECT aID from mytable where bID = bi" query.
Q: я могу получить уникальный набор идентификаторов с помощью одной простой операции SELECT?
я думал так
"SELECT aID from mytable where bID in ( <here count all bi > )"
но я не знаю, насколько большой будет строка запроса, когда K — число b станет большим (10 ^ 5), и я не знаю, что Firebird может или не может поддерживать запрос большой строки.
Благодарю.
Это делает то, что ты хочешь?
select distinct aID
from mytable
where bID between 0 and k;
РЕДАКТИРОВАТЬ:
Загрузите ваш bid в (временную) таблицу и выполните:
select distinct t.aID
from mytable t join
TempBids tb
on t.bID = tb.bID;