使简单的自加入更加高效

发布于 2024-09-29 00:51:44 字数 565 浏览 3 评论 0原文

我的表

id|level|name

级别可以是 1,2 或 3,

我想要得到的是:

id|lvl1name|lvl2name|lvl3name

我正在使用以下查询

SELECT L1."name" as lvl1name, L2."name" as lvl2name, L3."name" as
lvl3name, L1.id
 FROM table as L1
       JOIN table as L2 ON L1.id = L2.id
       JOIN table as L3 ON L2.id = L3.id
       WHERE L1.lvl='1' and L2.lvl='2' and L3.lvl='3';

,但它太慢了!

必须有更好的方法来做到这一点。请帮助

这个例子,我正在使用 postgres,但我很乐意学习一些不依赖于数据库功能的方法。

我无法编写过程(只读访问),并且我从视图中选择它。

I have a table

id|level|name

level can be 1,2 or 3

what I want to get is:

id|lvl1name|lvl2name|lvl3name

I'm using the following query

SELECT L1."name" as lvl1name, L2."name" as lvl2name, L3."name" as
lvl3name, L1.id
 FROM table as L1
       JOIN table as L2 ON L1.id = L2.id
       JOIN table as L3 ON L2.id = L3.id
       WHERE L1.lvl='1' and L2.lvl='2' and L3.lvl='3';

but it is soooooo slow!

there must be a better way to do this. please help

for this example I'm using postgres, but I'd be happy to learn some way that is not database feature dependant.

I can't write procedures (read only access), and I select this from a view.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你与清晨阳光 2024-10-06 00:51:44

使用:

  SELECT t.id,
         MAX(CASE WHEN t.level = 1 THEN t.name END) AS level1name,
         MAX(CASE WHEN t.level = 2 THEN t.name END) AS level2name,
         MAX(CASE WHEN t.level = 3 THEN t.name END) AS level3name
    FROM YOUR_TABLE t
GROUP BY t.id

如果你需要这是动态的,你需要使用 动态 SQL

Use:

  SELECT t.id,
         MAX(CASE WHEN t.level = 1 THEN t.name END) AS level1name,
         MAX(CASE WHEN t.level = 2 THEN t.name END) AS level2name,
         MAX(CASE WHEN t.level = 3 THEN t.name END) AS level3name
    FROM YOUR_TABLE t
GROUP BY t.id

If you need this to be dynamic, you need to use dynamic SQL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文