1

我有三张桌子:

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(股票代码。 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

我认为是这样的:

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

....但是怎么写呢?

4

3 回答 3

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

于 2012-04-24T08:35:51.117 回答
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如果你想限制LIMIT他们在连接表中的选择:

INNER JOIN
( 
   SELECT * FROM COEF LIMIT 0, n
) c ON s.id = c.id_spre

或者:WHERE c.id IN (1, 2, 3, 4, 5)如果没有太多值,您可以使用。

于 2012-04-24T08:22:57.193 回答
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.

A Join 当您想要创建树并读取邻接列表并避免递归函数时也很有用。在 Left Join 中,不满足您对左表要求的空结果将被丢弃在结果中。

于 2012-04-24T08:30:03.180 回答