Leaving aside the old-style outer join syntax of
FROM Table1 AS T1, Table2 AS T2
WHERE T1.Col1 *= T2.Col2
which has mostly died-a-death ...
I always code the Target Table ()T2 in this example) columns on the LEFT as follows:
FROM Table1 AS T1
JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
AND T2.Col2 = T1.Col2
the reason being that I am trying to define what data I want from Table2 and, as such, I want to make sure that all the criteria for Table2 have been supplied (i.e. I don't want any ambiguously matched rows nor cartesian joins)
Usually the columns involved will be the Primary Key columns from Table2, and with this layout I can easily see them aligned vertically on the left
New-hires who start work here think it weird, and not what they are used to, but after a short while have always commented that they find it more reliable ("defensive").
My Joins are laid out as shown above - indented and with each condition on a separate line. (We strive to have single-column primary keys, which helps to make JOINs more straightforward, but its not always possible). Experience has shown that this reduces the chance of associating incorrect columns in the JOIN and reducing the chance of errors during code maintenance - although I'd be the first to admit that "Consistent" is the most important factor in reducing errors during code maintenance.
Of course there are always exceptions! and "what about when"s
I prefer
FROM Table1 AS T1
JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
AND T2.Col2 = 'xxx'
rather than
FROM Table1 AS T1
JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
WHERE T2.Col2 = 'xxx'
because I can easily (even if only for debugging) change JOIN to LEFT OUTER JOIN (the WHERE T2.Col2 = 'xxx' would, otherwise, force an inner join)
One particular exception that I don't have a good answer for is if the main Table1 contains an attribute which governs whether that row joins to Table2 or Table3. I would code that as follows:
FROM Table1 AS T1
LEFT OUTER JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
AND T1.AttributeCol = 'T2'
LEFT OUTER JOIN Table3 AS T3
ON T3.Col1 = T1.Col1
AND T1.AttributeCol = 'T3'
but it is not pretty
Another wrong-way-round scenario (which similarly stinks a bit!) would be
FROM Table1 AS T1
JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
AND T1.Col2 LIKE '%' + T2.Col2 + '%'
can't say I use that often, thankfully but it certainly does happen.
I also tend to use an Outer Join instead of a NOT EXISTS
INSERT INTO Table2
(
Col1, Col2, ...
)
SELECT Col1, Col2, ...
FROM Table1 AS T1
LEFT OUTER JOIN Table2 AS T2
ON T2.Col1 = T1.Col1
WHERE T2.Col1 IS NULL
this is partly because I can duplicate the code for an UPDATE (for an existing row) in blocks of code that need to do UpSert type operations. These might now more reasonably be replaced with MERGE statements though.