Sql 内部联接失败后选择
我对SQL非常陌生,在我看来,我遇到了一些奇怪的事情: 我有以下疑问:Sql 内部联接失败后选择,sql,inner-join,Sql,Inner Join,我对SQL非常陌生,在我看来,我遇到了一些奇怪的事情: 我有以下疑问: SELECT id FROM Worker INNER JOIN Computer ON Worker.Id = Computer.Id 非常简单的东西。但是这个查询将失败,我认为这个查询失败是违反直觉的 查询将失败,因为我将有两列名为id。我可以通过编写以下命令来实现查询: SELECT Worker.id FROM Worker INNER JOIN Computer ON Worker.Id = Computer
SELECT id
FROM Worker
INNER JOIN Computer ON Worker.Id = Computer.Id
非常简单的东西。但是这个查询将失败,我认为这个查询失败是违反直觉的
查询将失败,因为我将有两列名为id
。我可以通过编写以下命令来实现查询:
SELECT Worker.id
FROM Worker
INNER JOIN Computer ON Worker.Id = Computer.Id
我的问题是:
为什么我的查询需要我声明我想要id来自哪个表,因为
SELECT worker.id from worker
除了编写
SELECT Worker.id from Worker
之外,还有没有更好的方法来定义我想要从哪个表中获取id,因为我觉得我好像在某种程度上重复了自己的想法,这取决于每个数据库提供程序如何处理自己的查询语法,但我的想法如下:
1) 我从哪张桌子上拿到它并不重要
在您的示例中,这可能无关紧要,但当数据类型不匹配(int/smallint
,date/datetime
,int/string
)时,情况又如何呢?或者如果您使用的是左/右连接
,而不是内部连接
?在这些情况下,数据库提供者必须做出选择
2) 我几乎是说我想在 正在从中选择Worker.id 是的,您可以使用表格的顺序来解决歧义。这也是数据库提供者可以做出的决定
有没有更好的方法来定义我想要从哪个表中获取id 从Worker中写入SELECT Worker.id,因为我感觉好像重复了 在某种程度上是我自己 我尽量避免使用
内部联接
进行过滤。相反,我会这样编写查询:
SELECT id FROM Worker where id in (select id FROM Computer)
SELECT w.id
FROM Worker AS w
INNER JOIN Computer AS c ON w.Id = c.Id
或
(这些可能不会返回与查询相同的结果,因为
内部联接可能会导致重复)这取决于每个数据库提供程序如何处理自己的查询语法,但以下是我的想法:
1) 我从哪张桌子上拿到它并不重要
在您的示例中,这可能无关紧要,但当数据类型不匹配(int/smallint
,date/datetime
,int/string
)时,情况又如何呢?或者如果您使用的是左/右连接
,而不是内部连接
?在这些情况下,数据库提供者必须做出选择
2) 我几乎是说我想在
正在从中选择Worker.id
是的,您可以使用表格的顺序来解决歧义。这也是数据库提供者可以做出的决定
有没有更好的方法来定义我想要从哪个表中获取id
从Worker中写入SELECT Worker.id,因为我感觉好像重复了
在某种程度上是我自己
我尽量避免使用内部联接
进行过滤。相反,我会这样编写查询:
SELECT id FROM Worker where id in (select id FROM Computer)
SELECT w.id
FROM Worker AS w
INNER JOIN Computer AS c ON w.Id = c.Id
或
(这些可能不会返回与查询相同的结果,因为内部联接可能导致重复)
但是这个查询将失败,我认为这个查询失败是违反直觉的
我认为很清楚为什么查询会失败。至少我还没有看到一个DB实现不会失败(MySQL会失败,消息是“column id is Duminalize”,PostgreSQL会失败,消息是“ERROR:column reference“id”is Duminalize”,MS-SQL会声明一些非常类似的内容),但可能存在不会失败的实现
为什么我的查询要求我声明我希望id来自哪个表
因为列id
存在于两个表中
1) 我从哪张桌子上拿到它并不重要
你是这么说的,但是数据库怎么知道呢?假设您在两个表中有时间戳(我们称它们为table_A
和table_B
),指示记录插入表中的时间。现在你告诉DB:“嘿,加入表A
和表B
,哦,请给我时间戳!”
DB怎么知道你指的是哪个时间戳
2) 我几乎是通过说selectid fromworker从“worker”表中获取它
你们说你们想从工人那个里得到数据,再加上电脑里的数据!通过将两个表连接在一起,您将得到一个单独的表。如果在多个表中出现行名,则必须明确说明每行的来源。回到上一个示例,如果table_A
有一个名为file_size的行,而table_B
没有,那么就可以说
SELECT file_size
FROM table_A
JOIN table_B on table_A.id = table_B.id
因为只有一列具有该名称
除了编写SELECT Worker.id from Worker外,还有没有更好的方法来定义我想要从哪个表中获取id,因为我感觉好像在某种程度上重复了我自己
除了Aducci提出的建议之外,另一个可能的方法是使用别名,如下所示:
SELECT id FROM Worker where id in (select id FROM Computer)
SELECT w.id
FROM Worker AS w
INNER JOIN Computer AS c ON w.Id = c.Id
这样,您就不必每次都键入整个表名
但是这个查询将失败,我认为这个查询失败是违反直觉的
我认为很清楚为什么查询会失败。至少我还没有看到一个DB实现不会失败(MySQL会失败,消息是“column id is Duminalize”,PostgreSQL会失败,消息是“ERROR:column reference“id”is Duminalize”,MS-SQL会声明一些非常类似的内容),但可能存在不会失败的实现
为什么我的查询要求我声明我希望id来自哪个表
因为列id
存在于两个表中
1) 我从哪张桌子上拿到它并不重要
你是这么说的,但是数据库怎么知道呢?假设你有两个时间戳