我可以使用内部联接改进此查询吗?

时间:2019-02-04 11:49:13

标签: postgresql

我有这个查询,它可以正常工作,但是它并不容易阅读,我想知道是否可以通过联接来改进它。当前,我需要手动指定资产表上除一列(特别是id_template)以外的所有列,但我宁愿直接在id字段的顶部加入子查询。不过,我无法解决该怎么做,甚至有可能吗?

public function test_user_notExist_admin()
{
  $mock = \Mockery::mock(DownloadController::class, [
            'get_download_links_from_download_server'       => $this->links,
            'post_details_to_log_server'                    => [200, "new"],
            'connect'                                       => [
                "Roles"         => [
                    "authenticated",
                    "subscriber"
                ]
                , "days" => "38"
            ]
        ]
    )->makePartial();

 $this->get('/api/v1/exampledl?uid=1&n_id=400&u_ip=104.58.1.45&dl_id=a81498a9')
  ->assertStatus(200)
  ->assertSee('links');

  $this->assertDatabaseHas('users', [
   'uid'               => (int)request('uid'),
   'subscription.role' => 'administrator',
 ]);
}

此处要求以上述形式从JSON查询返回的数据,请以奇怪的名称等为借口来代替测试数据。

SELECT *, (
    SELECT to_json(template) AS template
    FROM (
        SELECT *, (
            SELECT json_agg(to_json(fields)) as fields
            FROM (
                SELECT *
                FROM public.fields
                WHERE id_template = templates.id
            ) fields
        )
        FROM public.templates    
        WHERE templates.id = assets.id_template
    ) template
)
FROM public.assets
WHERE assets.id = $1

谢谢!

1 个答案:

答案 0 :(得分:2)

看来有点棘手。我自己对Postgres还是陌生的。由于没有任何数据可以测试我的查询,因此我必须像这样提交它。

您的查询包含一些所谓的相关子查询,即,当外部查询的select语句中有一个子查询时,它们通过{{1}链接}-条款。据我所知,它们可以用左联接代替。这就是我所做的。希望它能工作。如果没有,也许它仍然给您一个新主意。

where