2017-09-22 86 views
2

我非常新的SQL和我遇到的东西,在我看来是一种奇怪的:选择INNER JOIN失败后

我有以下查询:

SELECT id 
FROM Worker 
INNER JOIN Computer ON Worker.Id = Computer.Id 

很简单的东西。这个查询将失败,但我认为这个查询失败是违反直觉的。

该查询将失败,因为我将有2列称为id。我可以作出书面查询工作:

SELECT Worker.id 
FROM Worker 
INNER JOIN Computer ON Worker.Id = Computer.Id 

我的问题是:

为什么我的查询需要我说明我想要的表从因为

  1. 一点也没有了ID”从哪个表我得到它的问题

  2. 我几乎说,我希望它从'工人'表说SELECT Worker.id FROM Worker

,并有更好的方法来定义我想要的表从除了写作SELECT Worker.id FROM Worker的ID,因为我觉得,如果我的方式重复自己

回答

2

这是依赖于每个数据库供应商如何处理他们的自己的查询语法,但这里是我的想法:

1) It doesn't matter from which table I get it

它可能不是在你的例子没关系,但有关情况时,数据类型不匹配的内容(int/smallintdate/datetimeint/string)?或者如果您使用的是left/right join而不是inner join?在这些情况下,数据库提供者将不得不作出选择。


2) I pretty much stated that I want it from the 'worker' table by saying SELECT Worker.id FROM

是的,你可以使用表顺序来解决歧义。这又是数据库提供商可以做出的决定。


is there a better way to define what table I want the id from besides writing SELECT Worker.id FROM Worker because I feel as if I repeated myself in a way

我尽量避免使用inner joins过滤。相反,我会写这样的查询:

SELECT id FROM Worker where id in (select id FROM Computer) 

SELECT id FROM Worker as w where exists (select 1 from Computer as c where c.id = w.id) 

(这些可能不会返回相同的结果作为查询,因为inner join可能导致重复)

+0

感谢您的回复!你能告诉我为什么你避免内部连接? – ViktorG

+0

@ViktorG - 我只在用于过滤时避免使用它们(您没有从连接表中选择任何列或在随后的连接中使用它)。我觉得它使得查询更具可读性,避免为查询添加'distinct' – Aducci

+1

非常感谢:)让我对它更加清楚! – ViktorG

0

This query will fail though and I think that this query failing is counterintuitive.

我认为这很清楚为什么查询会失败。至少我还没有看到数据库实现不会失败(MySQL将失败并显示消息“列ID不明确”,PostgreSQL将失败并显示消息“错误:列引用”ID“不明确”,MS- SQL将陈述非常相似的东西),但可能存在不会失败的实现。

Why does my query require me to state what table I want the id from.

因为列id存在于两个表中。

1) It doesn't matter from which table I get it

这就是你说的,但数据库应该怎么知道?假设你在两张表中有时间戳(我们称它们为table_Atable_B),指示何时将一条记录插入表中。现在你告诉DB:“嘿,加入table_Atable_B,哦,请给我时间戳!”

数据库应该如何知道你的意思是哪个时间戳?

2) I pretty much stated that I want it from the 'worker' table by saying SELECT id FROM Worker

你说你想从工人数据,与数据从加盟计算机!通过将两个表连接在一起,您将得到一张表。如果在多个表中出现行名称,则必须明确指出每行来自哪里。让我们再回到前面的例子,如果table_A有一个名为FILE_SIZEtable_B行不,那是不够的说

SELECT file_size 
FROM table_A 
    JOIN table_B on table_A.id = table_B.id 

,因为只有与这个名字一列。

and is there a better way to define what table I want the id from besides writing SELECT Worker.id FROM Worker because I feel as if I repeated myself in a way

从另一个建议possiblitly -apart Aducci作出─将使用别名,就像这样:

SELECT w.id 
FROM Worker AS w 
    INNER JOIN Computer AS c ON w.Id = c.Id 

这样你就不必键入出整个表名每时间。

1

在SQL Server中,请特别注意这个查询。

DECLARE @var1 date ='01/01/2017' 
DECLARE @Var2 varchar(20)='01/01/2017' 

if (@[email protected]) 
BEGIN 
    select 'match' 
END 

结果是它说因为隐式数据转换而匹配。 SQL引擎如何知道在像这样的实例中提供哪个值?就我个人而言,我喜欢它需要该特定产品中的别名。