# Striim 3.10.1 documentation

##### Joins

Inner joins may be performed implicitly by specifying multiple sources in the FROM clause. For example:

FROM PosData5Minutes p, HourlyAveLookup l

Other joins must be explicitly declared. See CREATE CQ (query).

A join must include bound data, in other words, at least one cache, event table, WActionStore, or window. For example, assuming that StoreOrders is a stream that originated from a source and ZipCodeLookup is a cache, the following is valid:

SELECT s.storeId, z.latVal, z.longVal
FROM StoreOrders s, ZipCodeLookup z
WHERE s.zip = z.zip

When joining events from multiple streams, the CQ's SELECT FROM should reference windows rather than streams. See the LargeRTCheck and ZeroContentCheck flows in the MultiLogApp sample application for examples. Define the windows so that they are large enough to include the events to be joined. If necessary, use the GRACE PERIOD option (see CREATE STREAM) and/or a sorter (see CREATE SORTER) to ensure that the events' timestamps are in sync.