2012-06-27 90 views
3

我可以使用USING子句连接多个表吗?即我能做到这一点SQL在单列上连接多个表

SELECT * FROM (a, b, c) USING(date) 

或类似的,而不是

SELECT * FROM a, b USING(date), c USING(date) 

的东西吗?

我正在使用MySQL。

编辑
我从答案中看到我被误解了。第二个例子工作正常,但是对于很多表格来说只是很长而且很冗长。我正在寻找更清晰的语法,而不是更复杂的方法来实现这一点。

+0

Oracle或ETC ..或.. – shareef

+0

@shareef对不起。MySQL – baruch

+0

为什么alogorithim或你想解决的问题或存档 – shareef

回答

4

有没有这样的语法来实现你想要的,但是有一件事要接近:

这是一种看起来像dow不过,您可以考虑使用NATURAL JOIN语法,其中用于连接的条件是隐含的,因为您无需指定要加入的列。隐式条件发生在您加入的表中具有相同名称的列上。

如果date是具有在所有表的相同名称的唯一列,那么你可以做这样的事情:

SELECT * 
FROM a 
NATURAL JOIN b 
NATURAL JOIN c 

这将隐式连接表的列date因为字段名称在表格中是相同的。

这种方法的缺点是当然的事实,你不能有相同名称的任何其他列的另一个表,否则你的加入将打破那些列将无意中计入加盟条件。

更多关于NATURAL JOIN

+0

NATURAL JOIN's的一个很大的缺点是他们加入*任何*常见的名字(&&通用格式列)。 –

+0

这是迄今为止唯一的答案,实际上回答这个问题,但它并没有帮助我,因为有其他列具有相同的名称。 – baruch

+1

@baruch不幸的是你想使用的语法是不明确的。尝试并理解歧义可能来自何处,为什么最常用的语法更加复杂,为什么它们允许您更好地控制自己正在做的事情,最终你会对它们感觉更舒适。 –

4

不,不幸的是,您不能在您的示例中使用该语法。这不是有效的SQL。

相反,你可以使用任何如下:

您可以使用显式JOIN语法来实现你想要的。

SELECT * 
    FROM x 
    LEFT JOIN y USING(date) 
    LEFT JOIN z USING(date); 

通常为了更好的控制,您可以使用ON子句。

SELECT * 
    FROM x 
    LEFT JOIN y ON x.date = y.date 
    LEFT JOIN z ON y.date = z.date; 
+0

这并没有达到我想要的。我想只为同一列上的所有表连接的整个列表写入一次using子句。 – baruch

+0

另外,你的两个例子并不相同。 'ON'示例将有2个日期列,而'USING'将只有1个。 – baruch

+1

@baruch你的问题是“可以这样做”。我不回答“不是不正确的SQL语法”,而是回答“这是正确的SQL语法”。我会更新我的答案,提到您的示例不适合SQL语法的事实。 –

-1

您可以使用JOIN子句来连接两个表,但是,两个表必须与外键连接,例如:

SELECT Persons.Name 
FROM Persons 
INNER JOIN Orders 
ON Persons.Id = Orders.Id; 
+0

-1因为提到**必须**而不是提及**应该**。例如,MyISAM不支持/强制执行外键约束。 –

1

使用UNION ALL

SELECT * FROM a WHERE myDate = 'yourDate' 
UNION ALL 
SELECT * FROM b WHERE myDate = 'yourDate' 
UNION ALL 
SELECT * FROM c WHERE myDate = 'yourDate' 
+0

很确定这是原始海报想要的。 –