5 ms·
If I was going to add anything - "Vertical join" is normally called union. "Right join" is just (bad) syntax sugar and should be avoided. Left join with the t
by andy81 3y ago
If I was going to add anything -
"Vertical join" is normally called union.
"Right join" is just (bad) syntax sugar and should be avoided. Left join with the tables reversed is the usual convention.
The join condition for inner is optional- if it's always true then you get a "cross join". Can be useful to show all the possible combinations of two fields.
- wood_spirit 3y agoAll the other non-left joins are just syntactic sugar and can be expressed using only left join…?
- tzot 3y ago> All the other non-left joins are just syntactic sugar and can be expressed using only left join…? A “vertical join” (SQL UNION) is one of the “non-left joins”. How can you transform a “vertical join” to a “left join”?
- cbreezyyall 3y agoThis feels like an interesting interview question. I think you could simulate this with a full outer join on the entire select list and coalesce? For a UNION ALL you could put some literal column in the selects from both tables that you set to different values and include that in the join so you'd get a result set that will have all nulls in the right table columns for the rows in the left table and vice versa. Something like WITH top_t AS ( SELECT a ,b ,c ,'top' as nonexistent_col FROM table_1 ), bottom_t AS ( SELECT a ,b ,c ,'bottom' as nonexistent_col FROM table_2 ) SELECT COALESCE(top_t.a, bottom_t.a) AS a ,COALESCE(top_t.b, bottom_t.b) AS b ,COALESCE(top_t.c, bottom_t.c) AS c FROM top_t FULL OUTER JOIN bottom_t ON top_t.a = bottom_t.a AND top_t.b = bottom_t.b AND top_t.c = bottom_t.c AND top_t.nonexistent_col = bottom_t.nonexistent_col -- remove this for a normal UNION
- wood_spirit 3y agoBravo!!
- tzot 3y agoThis is a nice trick using full outer join! My question to wood_spirit still stands, though.
- wood_spirit 3y agoA fun challenge :) Assuming a null we can use as sentinel: SELECT COALESCE(a.col, b.col) AS col FROM a LEFT JOIN b ON (TRUE) WHERE (a.col IS NULL) IS DISTINCT FROM (b.col IS NULL) (Getting that sentinel might take effort, depending on eg whether there are useful window functions. Here is a way to do it with only left joins and the assumption the column has no duplicate values: WITH crossed AS ( SELECT * FROM UNNEST([1, 2]) AS sentinal ) SELECT IF(sentinal = 1, col, NULL) AS col FROM a LEFT JOIN crossed ON TRUE WHERE sentinal = 1 OR col = (SELECT * FROM a LIMIT 1)
- Little_Kitty 3y agoOf the tens of thousands of queries I've written I've needed right join the exactly once. It's a feature which is neat in that it exists, but the prevalence in teaching materials is entirely unjustified. Cross joins are massively more practical and enable some efficient transformations, but are usually taught only as all to all without a clear position on why they are useful.
- Terr_ 3y ago> , but the prevalence in teaching materials is entirely unjustified. I agree that it is seldom good query-writing practice, but I think it makes sense in education because it rounds out the join variations to name them symmetrical, and thus easier to remember.
- recursive 3y agoHow would you rewrite a left join followed by a right join? I don't think right joins are always sugar.
- jayknight 3y agoMake the "middle" table first and do to left joins from that one to the other two
- recursive 3y agoConsider a LEFT JOIN b RIGHT JOIN c. You'll get all the records from c. Now consider b LEFT JOIN a LEFT JOIN c. The result is not the same at all.
- winternewt 3y agoc LEFT JOIN (a LEFT JOIN b) is the same.
- recursive 3y agoI didn't know this was syntactically valid, but maybe it is.
- winternewt 3y agoIt most definitely is. A join is a binary operator and hence has only two operands. Joining three tables requires an associativity rule, and joins are left associative. The ability to omit braces could arguably be considered syntactic sugar as well. In other words a LEFT JOIN b RIGHT JOIN c is equivalent to (a LEFT JOIN B) RIGHT JOIN c. Once you have that, you can flip the RIGHT JOIN by swapping the operands, giving you c LEFT JOIN (a LEFT JOIN b).
- recursive 3y agoSQL grammar could easily specify that braces are just not allowed. In fact, I thought that was the case. Now that I know they're allowed, now I agree that right joins have no reason to exist.