1
34
我在这里看到两种可能的情况。首先,您想知道是否有一个针对这个的SQL标准,不管数据库是什么,您都可以使用它。不,没有。第二,你想知道一个特定的DBMS产品。然后你需要识别它。但我认为最有可能的答案是,您将得到类似“a.i d,b.i d”的返回,因为这就是您需要在SQL表达式中标识列的方式。找出默认值的最简单方法就是提交这样的查询,然后看看能得到什么。例如,如果要指定点前面的前缀,可以使用“select*from a”作为我的\别名。 |
2
57
您的问题的答案似乎是否定的,但是您可以使用的一种方法是分配一个虚拟列来分隔每个新表。如果在脚本语言(如python或php)中循环遍历列列表的结果集,那么这一点尤其有效。
我知道这并不能准确回答你的问题,但是如果你是一个编码员,这是一个很好的方法来分离具有重复列名的表。希望这能帮助别人。 |
3
19
我完全理解为什么这是必要的——至少对我来说,当有很多表需要连接时(包括许多内部连接),它在快速原型制作过程中很方便。只要第二个“joinetable.*”字段通配符中的列名相同,主表的字段值就会被joinetable值覆盖。当不得不手动指定带有别名的表字段时,容易出错、令人沮丧并违反dry… 下面是一个php(wordpress)函数,通过代码生成以及如何使用它的示例来实现这一点。在本例中,它用于快速生成一个自定义查询,该查询将提供通过 高级自定义字段 字段。
输出:
|
4
10
我知道的唯一一个数据库是sqlite,这取决于您配置的设置。
否则,如果您在查询中键入列的名称太麻烦,那么我只能推荐按顺序位置而不是按列名称提取结果集中的列。
这是一个很好的例子
it's bad practice to use
我了解支持可能更改名称或位置的列的必要性,但使用通配符可以实现这一点 更努力 不容易。 |
5
5
不同的数据库产品会给你不同的答案;但是如果你走得太远,你会让自己受到伤害。你最好不要选择你想要的列,给它们自己的别名,这样每一列的标识都是清晰的,你可以在结果中区分它们。 |
6
5
我和OP处于同一条船上——我加入了三个不同表中的几十个字段,其中一些字段具有相同的名称(如ID、名称等)。我不想列出每个字段,所以我的解决方案是对共享名称的字段进行别名,并对具有唯一名称的字段使用select*。 例如: 表A: 身份证件, 姓名, 第一场, 第二场… 表B: 身份证件, 姓名, 第三场, 第四场… 选择a.id作为a id,a.name作为a name,a.*,b.id作为b id,b.name作为b name,b.*…。 当访问结果时,我们将使用这些字段的别名,并忽略“原始”名称。 也许不是最好的解决方案,但它对我有用……我使用的是MySQL |
7
4
这个问题在实践中非常有用。只需要列出软件编程中的每个显式列,在这些列中,您要特别小心地处理所有条件。 想象一下,在调试时,或者尝试使用DBMS作为日常办公工具,而不是特定程序员抽象基础架构的可更改的实现,我们需要编写大量的SQL。该场景随处可见,如数据库转换、迁移、管理等,其中大多数SQL只执行一次,不再使用,给每个列命名只是浪费时间。别忘了,SQL的发明不仅仅是为了程序员使用。 通常我将创建一个带有前缀的列名的实用程序视图,这里是pl/pgsql中的函数,这并不容易,但是您可以将它转换为其他过程语言。
实例:
|
8
2
没有用于此的SQL标准。 但是,通过代码生成(在创建或更改表时按需生成,或者在运行时生成),您可以很容易地做到这一点:
|
9
2
我完全理解你关于重复域名的问题。 我也需要它,直到我编写了自己的函数来解决它。如果您使用的是PHP,那么您可以使用它,如果您有以下功能,也可以使用您的语言编写代码。
这里的诀窍是
这会在所有列前面加上前缀;) 当做,
|
10
1
或者可以使用红门SQL重构或SQL提示,单击选项卡按钮将select*扩展到列列表中。 所以在您的例子中,如果您输入select*from a join b… 转到*的末尾,选项卡按钮,瞧!你会看到 选择A.column1,A.column2,…。,B.column1,B.column2来自连接B 但这不是免费的 |
11
1
如果在要连接的2个或3个表中存在某个字段,那么如何在WHERE子句中引用该字段,就不能不加别名了。 对于MySQL,您试图引用的是哪一个还不清楚。 |
12
1
我通过重命名相关表中的字段解决了我的一个类似问题。是的,我有幸做到这一点,我明白每个人都可能没有。我为表中表示表名的每个字段添加了前缀。因此,OP发布的SQL将保持不变-
并且仍然给出了预期的结果——便于识别输出字段所属的表。 |
13
0
有两种方法可以让我想到以可重用的方式实现这一点。一种方法是用列的前缀重命名所有列。我见过很多次,但我真的不喜欢。我发现它是多余的,会导致大量的输入,并且当需要覆盖一个来源不清楚的列名的情况时,您可以总是使用别名。 另一种方法,如果您致力于完成这一点,我建议您在这种情况下这样做,就是为每个表创建别名为表名的视图。然后针对这些视图而不是表进行联接。这样,您可以自由使用*如果愿意,可以自由使用具有原始列名称的原始表,并且还可以方便地编写任何后续查询,因为您已经在视图中完成了重命名工作。 最后,我不清楚为什么您需要知道每个列来自哪个表。这有关系吗?最重要的是他们所包含的数据。用户ID是来自用户表还是来自用户问题表并不重要。当然,当您需要更新它时,它是很重要的,但是在这一点上,您应该已经足够了解您的模式来确定它。 |
14
0
如果担心模式更改,这可能对您有用: 1。对所有相关表运行“描述表”查询。 2。使用返回的字段名动态构造以所选别名为前缀的列名字符串。 |
15
0
对于那些使用mysql c-api的人,您的问题有一个直接的答案。 给定SQL:
“mysql_stmt_result_metadata()”的结果给出了从准备好的SQL查询到结构mysql_field[]的字段定义。每个字段包含以下数据:
注意字段:目录、表、组织名称
现在您知道SQL中的哪些字段属于哪个模式(即目录)和表。 这足以通用地从多表SQL查询中标识每个字段,而无需对任何字段进行别名。 一个实际的产品sqlyog显示在这样一个庄园中使用这个精确的数据,当存在pk字段时,它们能够独立地更新多表联接的每个表。 |
16
0
从发展 this solution ,这是我处理问题的方法:
首先创建所有
然后在查询中使用它:
但是,这可能需要修改,因为类似的东西只在SQL Server中测试。但此代码在SQL Server中不完全有效,因为不支持使用。 如果您可以测试/更正此代码(例如mysql),请发表评论。 |
17
0
最近在Nodejs和Postgres中遇到了这个问题。 ES6方法 我知道没有任何RDBMS功能提供此功能,因此我创建了一个包含所有字段的对象,例如:
定义了一个reducer,将字符串与表名连接在一起:
这将返回字符串数组。为每个表调用它并组合结果:
输出最终的SQL语句:
|
18
0
我实现了一个基于 the answer suggesting using dummy or sentinel columns 在节点中。您可以通过生成如下SQL来使用它:
然后对从数据库驱动程序中得到的行进行后处理,就像
实施(基于
测试:
|
19
-1
select*通常会导致错误的代码,因为新列往往会被添加,或者表中的列顺序经常发生变化,这通常会以非常微妙的方式中断select*的操作。所以列出列是正确的解决方案。 至于如何进行查询,不确定mysql,但是在sqlserver中,可以从syscolumns中选择列名并动态构建select子句。 |
20
-1
php 7.2+mysql/mariadb MySQL将向您发送多个同名字段。即使在终端客户机中。但是如果你想要一个关联数组,你就必须自己制作键。 感谢@axelbrz的原创。我把它移植到了新的PHP上,并对其进行了一些清理:
|
21
-1
我要做的是使用Excel连接过程。例如,首先我选择*并获取所有列,将它们粘贴到Excel中。然后写出我需要包围这个列的代码。假设我需要将prev添加到一组列中。在A列中有我的字段,在B列中有“as prev_uu”,在C列中有我的字段。在D列中有一列。 然后在E列中使用concatate并将它们合并在一起,确保包含空格。然后剪切并粘贴到SQL代码中。我还使用这个方法为同一个字段和其他更长的代码编写了case语句,这些代码是我在一个几百字段表中为每个字段所需要做的。 |
Community wiki · SQL语法新手 1 年前 |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |