与UNION的SUBQUERIES

时间:2012-04-24 08:12:48

标签: mysql sql

我有三张桌子:

TICKERS
id 
ticker (varchar 100)

COEF
id
id_ticker
id_spre
coef (varchar 100)

SPRE
id
id_check
name (varchar 100)

我需要检索所有具有id_check = 1的SPRE记录然后对于此结果我必须获得具有SPRE.id = COEF.id_spre(一次)的所有记录,然后是所有与COEF相关的TICKERS (tickers.id = COEF.id_ticker)。

结果应该是:

SPRE.name
COEF.coef
TICKERS.ticker
TICKERS.ticker
TICKERS.ticker
....
....
SPRE.name
COEF.coef
TICKERS.ticker
TICKERS.ticker
TICKERS.ticker

(我重复tickers因为许多代码应该有相同的COEF

我想做类似的事情:

使用id_check = 1检索所有SPRE的查询,然后选择 UNION 2选择的SUBQUERY,第一个获取COEF.id_spre = SPRE.id,第二个获取所有代码与TICKERS.id = COEF.id_ticker

....但是怎么写呢?

3 个答案:

答案 0 :(得分:2)

等等..你想要结果出来吗?你想要在同一行中返回与一个spre相关的所有代码吗?

无论如何,它看起来像下面这样的东西可能是有用的:

SELECT 
    s.name
    ,c.coef
    ,t.ticker
FROM spre  as s 
    INNER JOIN coef as c 
        ON c.id_spre = s.id
    INNER JOIN tickers AS t
            ON t.id = c.id_ticker
    WHERE s.id_check= 1

http://sqlfiddle.com/#!3/c984a/15

如果您需要为SPRE限制它,那么以下工作:

SELECT 
    s.name
    ,c.coef
    ,t.ticker
FROM 
    (SELECT * FROM spre WHERE id_check=1 LIMIT 0,5 ) as s 
    INNER JOIN coef as c 
        ON c.id_spre = s.id
    INNER JOIN tickers AS t
        ON t.id = c.id_ticker

使用MSSQL语法:http://sqlfiddle.com/#!3/c984a/25

答案 1 :(得分:1)

不,您应该使用JOIN进行一次查询,如下所示:

SELECT s.name AS 'SPRE Name', c.coef, t.ticker
FROM SPRE s
INNER JOIN COEF c ON s.id = c.id_spre
INNER JOIN TICKERS t ON c.id_ticker = t.id
WHERE s_id_check = 1

来自此查询的数据是表格数据,格式如下:

 SPRE NAME |   COEF   |  TICKER
-----------+----------+-----------
  spre1        coef1     ticker11
  sper1        coef1     ticker12
  sper1        coef2     ticker121
  spre2        coef12    ticker22
  ...

然后在您的应用程序中,您可以按照自己的方式输出这些数据。 修改:如果您想在联接表中限制COEF {/ 1}}他们的选择:

LIMIT

或者:如果没有太多值,您可以使用INNER JOIN ( SELECT * FROM COEF LIMIT 0, n ) c ON s.id = c.id_spre

答案 2 :(得分:0)

您的问题描述不需要sql Union。联合是将两个选择合并在一起并将它们作为一个选择返回,例如当您需要页面浏览器时。我建议只使用左连接来连接结果,例如:

        Select * from t1 Left Join t2 ON id_t1 = id_t2 Left Join t3 ON id_t2 = id_t3 Where check_t1 = 1.

当您想要创建树并读取adjaceny列表并避免递归函数时,加入它也很有用。在左连接中,结果中将丢弃不符合左表要求的空结果。