Limiting join to top 1 row for each row
So there are two ways to do this:

If you have keys that guarantee that combinations of (targetId,start_date) are unique, a correlated subquery will return consistent results
If you cannot guarantee uniqueness, you will have to use a partitioning function in order to guarantee the same result is returned each  time the query is executed

If a unique index exists:
SELECT
  a.id
 ,a.userid
 ,a.targetid
 ,b.id AS b_id
 /* And other columns from Table B */
FROM
  table_a a
LEFT JOIN
  table_b b
    ON b.targetid = a.targetid
        AND b.start_date =
          (
            SELECT
              MAX(start_date)
            FROM
              table_b
            WHERE
              targetid = a.targetid
                AND start_date &lt;= a.start_date
          )

No unique index exists:
For this I'm assuming Id on Table B is a row identifier and unique.  If it isn't, you will need to add additional columns to the SORT portion of the PARTITION statement to guarantee the query is deterministic.
SELECT
  id
 ,userid
 ,targetid
 ,b_id
 /* Other columns from table b */
FROM
  (
    SELECT
      a.id
     ,a.userid
     ,a.targetid
     ,b.id AS b_id
     /* Other columns from Table B */
     ,ROW_NUMBER()
        OVER
          (
            PARTITION BY
              a.id
            ORDER BY
              b.start_date DESC
             ,b.id DESC
          ) AS rownum
    FROM
      table_a a
    LEFT JOIN
      table_b b
        ON b.targetid = a.targetid
            AND b.start_date &lt;= a.start_date
  ) x
WHERE
  rownum = 1

Notes:
As I mentioned in my earlier comment, the desired results you provided are inconsistent with the requirement tableb.start_date &lt;= tablea.start_date, specifically for Ids 22, 33, 44.