When I use left join
with for json path
I get an error:
Property ‘product_id’ cannot be generated in JSON output due to a conflict with another column name or alias. Use different names and aliases for each column in SELECT list.
from this query:
select top 1 1 as [foo.bar], p.*, cp.* from product p left JOIN company_product cp on cp.product_id = p.product_id for json path
when I change from for json path
to for json auto
it’s not throw error but the result is not output as expected:
[{ "foo.bar": 1, "product_id": 751, ... "cp": [{ "product_id": 751, "company_id": 273, .. }]
and it’s make another problem when I move 1 as [foo.bar]
to the end of the select:
select top 1 p.*, cp.*, 1 as [foo.bar] from product p left JOIN company_product cp on cp.product_id = p.product_id for json auto
The foo.bar
is inside cp
object. and it’s not as expected:
[{ "product_id": 751, ... "cp": [{ "product_id": 751, "company_id": 273, "foo.bar": 1, ..}]
Instead should be:
[{ "product_id": 751, ... "cp": [{ "product_id": 751, "company_id": 273, ..}], "foo.bar": 1, ..}]
So I have those problems when I use for json auto
. any idea if there is a way to use left join
with for path
or solve this issues that for auto
makes?
Advertisement
Answer
As is explained in the documentation, when …you specify the AUTO option, the format of the JSON output is automatically determined based on the order of columns in the SELECT list and their source tables… and you …can’t change this format. So, a possible option is to use a subquery:
Tables:
SELECT * INTO product FROM (VALUES (751)) v (product_id) SELECT * INTO company_product FROM (VALUES (751, 273), (751, 274)) v (product_id, company_id)
Statement:
SELECT p.*, cp.* FROM ( SELECT *, 1 as [foo.bar] FROM product ) p LEFT JOIN company_product cp on cp.product_id = p.product_id FOR JSON AUTO
Result:
[ { "product_id":751, "foo.bar":1, "cp":[ {"product_id":751, "company_id":273}, {"product_id":751, "company_id":274} ] } ]