我可以使用USING
子句连接多个表吗?即我能做到这一点SQL在单列上连接多个表
SELECT * FROM (a, b, c) USING(date)
或类似的,而不是
SELECT * FROM a, b USING(date), c USING(date)
的东西吗?
我正在使用MySQL。
编辑
我从答案中看到我被误解了。第二个例子工作正常,但是对于很多表格来说只是很长而且很冗长。我正在寻找更清晰的语法,而不是更复杂的方法来实现这一点。
我可以使用USING
子句连接多个表吗?即我能做到这一点SQL在单列上连接多个表
SELECT * FROM (a, b, c) USING(date)
或类似的,而不是
SELECT * FROM a, b USING(date), c USING(date)
的东西吗?
我正在使用MySQL。
编辑
我从答案中看到我被误解了。第二个例子工作正常,但是对于很多表格来说只是很长而且很冗长。我正在寻找更清晰的语法,而不是更复杂的方法来实现这一点。
有没有这样的语法来实现你想要的,但是有一件事要接近:
这是一种看起来像dow不过,您可以考虑使用NATURAL JOIN
语法,其中用于连接的条件是隐含的,因为您无需指定要加入的列。隐式条件发生在您加入的表中具有相同名称的列上。
如果date
是具有在所有表的相同名称的唯一列,那么你可以做这样的事情:
SELECT *
FROM a
NATURAL JOIN b
NATURAL JOIN c
这将隐式连接表的列date
因为字段名称在表格中是相同的。
这种方法的缺点是当然的事实,你不能有相同名称的任何其他列的另一个表,否则你的加入将打破那些列将也无意中计入加盟条件。
更多关于NATURAL JOIN
NATURAL JOIN's的一个很大的缺点是他们加入*任何*常见的名字(&&通用格式列)。 –
这是迄今为止唯一的答案,实际上回答这个问题,但它并没有帮助我,因为有其他列具有相同的名称。 – baruch
@baruch不幸的是你想使用的语法是不明确的。尝试并理解歧义可能来自何处,为什么最常用的语法更加复杂,为什么它们允许您更好地控制自己正在做的事情,最终你会对它们感觉更舒适。 –
不,不幸的是,您不能在您的示例中使用该语法。这不是有效的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;
您可以使用JOIN子句来连接两个表,但是,两个表必须与外键连接,例如:
SELECT Persons.Name
FROM Persons
INNER JOIN Orders
ON Persons.Id = Orders.Id;
-1因为提到**必须**而不是提及**应该**。例如,MyISAM不支持/强制执行外键约束。 –
使用UNION ALL
SELECT * FROM a WHERE myDate = 'yourDate'
UNION ALL
SELECT * FROM b WHERE myDate = 'yourDate'
UNION ALL
SELECT * FROM c WHERE myDate = 'yourDate'
很确定这是原始海报想要的。 –
Oracle或ETC ..或.. – shareef
@shareef对不起。MySQL – baruch
为什么alogorithim或你想解决的问题或存档 – shareef