2010-08-12 114 views
0

我试图做这样的事情:查询子查询

SELECT t1.*, 
     t2.* 
FROM (SELECT * 
     FROM USER) AS t1, 
     (SELECT * 
     FROM t1) AS t2 

它不会在MySQL的工作。是否像上述可能?我的另一种选择是采取最后的子查询,并围绕主查询“换行”。想法?

回答

2

用途:

SELECT t1.*, 
     t2.* 
    FROM (SELECT * 
      FROM USER) AS t1, 
     (SELECT * 
      FROM (SELECT * 
        FROM USER) AS t1) AS t2 

WITH语法允许你建立在热膨胀系数的顶部:

WITH t1 AS (
    SELECT * FROM USER), -- comma separates them 
    t2 AS (
    SELECT * FROM t1) 
SELECT t1.*, t2.* 
    FROM t1, t2 

..但MySQL不支持WITH子句。

1

为什么不

SELECT t1.*, t2.* FROM USER as t1, USER as t2 

?你还应该添加一个条件,否则这将会产生大量的行。

现在,如果你的意思是问怎么来指代前面的子查询,你应该重复它,并添加所需的额外条件:

SELECT t1.*, t2.* FROM (SELECT bar FROM foo WHERE baz=1) as t1, 
(SELECT bluz,bar FROM foo WHERE baz=1 AND quux = 0) as t2 WHERE t2.bar = t1.bar 

另一种选择是创建一个子查询视图或临时表(t1)

+0

因为t1和t2实际上是复杂的查询。我只是为了SO而简化了。 – StackOverflowNewbie 2010-08-12 00:54:49

+1

从所有的答案你看起来你过于简化:) – 2010-08-12 00:56:36

1

如果2个表的列数相同,则可以使用例如UNION 例如

SELECT * 
FROM USER 
UNION 
SELECT * 
FROM t1 

如果它们不具有相同的列,那么您将需要使用某种方式来加入表,如使用外键。例如。

SELECT * 
FROM USER as t1 
JOIN t1 as t2 (on t1.id = t2.id) 
0

我假设你的实际查询要复杂得多。是否有可能你可以创建一个视图来表示你的子查询,然后你可以使用一个更简单的选择语句,比如Vinko Vrsalovic建议的。