postgresql SQL select from two tables with union dont get right column name

6ss1mwsb  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(146)

我想从两个表categorysub_category中选择数据。
但我只得到category的列名。我想要categorysub_category
结果如下:

  1. { category_id: 3, category: 'GARDEN' },
  2. { category_id: 6, category: 'ART' },
  3. { category_id: 4, category: 'CONSOLE' },
  4. { category_id: 2, category: 'ELECTRONICS' },
  5. { category_id: 4, category: 'ELECTRONICS' },
  6. { category_id: 2, category: 'CONSOLE' },
  7. { category_id: 5, category: 'CHAIR' },
  8. { category_id: 6, category: 'COLORS' },
  9. { category_id: 5, category: 'GARDEN' },
  10. { category_id: 1, category: 'CONSOLE' },
  11. { category_id: 3, category: 'CUT' },
  12. { category_id: 1, category: 'ELECTRONICS' }

下面是我的代码:

  1. SELECT
  2. c.id AS category_id,
  3. c.category
  4. FROM
  5. category c
  6. UNION
  7. SELECT
  8. sc.id AS sub_category_id,
  9. sc.sub_category
  10. FROM
  11. sub_category sc

联系我们
以下是我预期结果:

  1. { category_id: 3, category: 'GARDEN' },
  2. { category_id: 6, category: 'ART' },
  3. { category_id: 4, category: 'CONSOLE' },
  4. { category_id: 2, category: 'ELECTRONICS' },
  5. { category_id: 4, category: 'ELECTRONICS' },
  6. { category_id: 2, category: 'CONSOLE' },
  7. { category_id: 5, category: 'CHAIR' },
  8. { category_id: 6, category: 'COLORS' },
  9. { sub_category_id: 5, category: 'GARDEN' },
  10. { sub_category_id: 1, category: 'CONSOLE' },
  11. { sub_category_id: 3, category: 'CUT' },
  12. { sub_category_id: 1, category: 'ELECTRONICS' }
dzhpxtsq

dzhpxtsq1#

推荐join的评论是正确的:
FULL OUTER JOIN返回所有连接的行,每个不匹配的左侧行加上一行(在右侧扩展为空),每个不匹配的右侧行加上一行(在左侧扩展为空)。
您可以指示它 not match,只显示两个表中所有不匹配的行:demo

  1. SELECT
  2. c.id AS category_id,
  3. c.category,
  4. sc.id AS sub_category_id,
  5. sc.sub_category AS sub_category
  6. FROM
  7. category c FULL OUTER JOIN sub_category sc ON false
  8. ORDER BY category_id, sub_category_id, category, sub_category;

| 类别id|类别|子类别ID|子范畴|
| --|--|--|--|
| 2 |控制台| * 空 | 空 *|
| 2 |电子| * 空 | 空 *|
| 3 |花园| * 空 | 空 *|
| 4 |控制台| * 空 | 空 *|
| 4 |电子| * 空 | 空 *|
| 5 |椅子| * 空 | 空 *|
| 6 |艺术| * 空 | 空 *|
| 6 |颜色| * 空 | 空 *|
| * 空 | 空 *| 1 |控制台|
| * 空 | 空 *| 1 |电子|
| * 空 | 空 *| 3 |切割|
| * 空 | 空 *| 5 |花园|

展开查看全部
wydwbb8l

wydwbb8l2#

问题在于您使用的是UNION操作,该操作垂直组合两个查询的结果,但它会丢弃第二个查询的列名,并根据第一个查询重命名列。
你应该使用JOIN操作!

  1. SELECT
  2. c.id as category_id,
  3. c.category,
  4. sc.id as sub_category_id,
  5. sc.sub_category
  6. FROM
  7. category c
  8. JOIN
  9. sub_category sc ON c.id = sc.category_id;
7y4bm7vi

7y4bm7vi3#

如果你想在UNION语句中区分行来自哪个表,你可以例如:添加一个单独的列到你的结果集,以指定-类似这样的东西:

  1. SELECT
  2. c.id AS category_id,
  3. c.category,
  4. 'Category' AS source_table
  5. FROM
  6. category c
  7. UNION
  8. SELECT
  9. sc.id,
  10. sc.sub_category,
  11. 'Subcategory' AS source_table
  12. FROM
  13. sub_category sc

然后,您得到的结果将在新的source_table列中包含CategorySubcategory,以告诉您行来自何处。

展开查看全部

相关问题