# Querying many tuples with composite key

**URL:** <https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472>\
**Category:** Issues\
**Created:** [June 18, 2021, 10:38am UTC](https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472 "2021-06-18T10:38:01Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![apohllo](https://yyz1.discourse-cdn.com/flex029/user_avatar/discourse.rom-rb.org/apohllo/32/86_2.png) [@apohllo](https://discourse.rom-rb.org/u/apohllo)\
**Post date:** [June 18, 2021, 10:38am UTC](https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472/1 "2021-06-18T10:38:01Z")

</div>

What is the easiest way to query many tuples with composite key in ROM SQL?  
Given a dataset with say `(product_id, position)` and an array of tuples

```auto
[
  { product_id: 10, position: 1},
  { product_id: 11, position: 2}
]

```

I am looking for the easiest way to query only those tuples, that match both values. Obviously this is a disjunction of many conjunctions, but I haven’t found how to query for it in a canonical way.

EDIT  
Shall I build a query like that:

```auto
tuples[1..].inject(dataset.where(tuples[0])) { |q, t| q.or(t) }

```

?

```auto

```

---

<div class="post-metadata">

**Author:** ![solnic](https://yyz1.discourse-cdn.com/flex029/user_avatar/discourse.rom-rb.org/solnic/32/279_2.png) [@solnic](https://discourse.rom-rb.org/u/solnic)\
**Post date:** [June 21, 2021, 8:31am UTC](https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472/2 "2021-06-21T08:31:21Z")

</div>

@apohllo yep that’s more or less what I’ve done in the past. We could have a helper method for this common scenario.

---

<div class="post-metadata">

**Author:** ![apohllo](https://yyz1.discourse-cdn.com/flex029/user_avatar/discourse.rom-rb.org/apohllo/32/86_2.png) [@apohllo](https://discourse.rom-rb.org/u/apohllo)\
**Post date:** [June 21, 2021, 10:02am UTC](https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472/3 "2021-06-21T10:02:51Z")

</div>

Ok, thanks. Actually this should be corrected, in the case the array has only one element:

```auto
(tuples[1..] || []).inject(dataset.where(tuples[0])) { |q, t| q.or(t) }

```

---

<div class="post-metadata">

**Author:** ![apohllo](https://yyz1.discourse-cdn.com/flex029/user_avatar/discourse.rom-rb.org/apohllo/32/86_2.png) [@apohllo](https://discourse.rom-rb.org/u/apohllo)\
**Post date:** [September 20, 2021, 5:06pm UTC](https://discourse.rom-rb.org/t/querying-many-tuples-with-composite-key/472/4 "2021-09-20T17:06:44Z")

</div>

or

```auto
tuples.drop(1).inject(dataset.where(tuples[0])) { |q, t| q.or(t) }

```
