在内部连接多个表时,我可以使用啥其他方法来选择 *?

Posted

技术标签:

【中文标题】在内部连接多个表时,我可以使用啥其他方法来选择 *?【英文标题】:What other approch I can use to select * while inner joining multiple tables?在内部连接多个表时,我可以使用什么其他方法来选择 *? 【发布时间】:2020-06-16 23:58:20 【问题描述】:

我想通过从多个表中选择所有数据来创建视图,但是我得到的错误是我有重复的列

CREATE VIEW All_Data AS
SELECT *
FROM table1 tb1
    INNER JOIN table 2 tb2 ON tb1.ID = tb2.ID
    INNER JOIN table 3 tb3 ON tb2.ID = tb3.ID
    INNER JOIN table 4 tb4 ON tb3.ID = tb4.ID
    INNER JOIN table 5 tb5 ON tb4.ID = tb5.ID
    INNER JOIN table 6 tb6 ON o.SpecialID = tb6.ID
    INNER JOIN table 7 tb7 ON tb6.ID = tb7.ID
    LEFT JOIN table 8 tb8 ON tb7.ID = tb8.ID

但是,我仍然遇到同样的问题。我想知道有没有更快的方法来代替使用别名一一选择每一列。

【问题讨论】:

注意oracle标签的鼠标悬停。它可能不是本意。欢迎来到 SO。还有dba.stackexchange.com纯数据库问题 命名(并正确限定)列。简单。 【参考方案1】:

DISTINCT 在谈论重复列与重复行时无济于事。

* 导致所有表中的列返回重复的列名。如果两者都需要,您需要将 * 替换为显式列并为它们起别名,如下所示。

SELECT p.created_date as product_created_date, order.created_date as order_created date .....

注意使用视图不是必需的模式。选择完全正确的结果通常就足够了。视图上的选择可能会影响性能,因为它们对 mysql 来说更复杂,无法优化。但是,如果您需要针对特定​​用户在它们上显示明确的 GRANT,它们会很有用。

【讨论】:

我知道,但是我的专栏太多了,我都需要 肯定是列名相同的缺点之一。对不起,没有简单的答案。一致的大小写将帮助您稍后编写查询。建议在代码过多之前修复。 我最终一一挑选所有列并使用别名。谢谢!【参考方案2】:

您需要提供您希望成为视图一部分的列的完整列表。没有捷径。

但是,是的,为了简化您的工作,如果您想要以逗号分隔的表的列名列表,那么您可以对每个表使用以下查询并将它们的列放在您的选择查询中。然后,您只需为具有相同名称的列设置别名。

Select listagg('pd.'|| column_name, ',')
         Within group (order by column_id)
  From user_tab_columns
 Where table_name = 'your_table_name_in_capital';

请注意,您需要将每个表的'pd.' 替换为查询中的表别名。

【讨论】:

以上是关于在内部连接多个表时,我可以使用啥其他方法来选择 *?的主要内容,如果未能解决你的问题,请参考以下文章

JVM 如何在内部处理竞争条件?

如何根据case语句在连接多个表时选择一行

OC字符串处理

ListView,是不是有一种简单的方法可以允许在内部拖动项目(内置)?

可以在内部测试轨道上测试 Google Play 游戏服务吗?

使用 Win NT 内核 API 连接大文件