Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 内部联接失败后选择_Sql_Inner Join - Fatal编程技术网

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

我对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.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) 我从哪张桌子上拿到它并不重要

    你是这么说的,但是数据库怎么知道呢?假设你有两个时间戳