我有三张桌子:
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
....但是怎么写呢?
答案 0 :(得分:2)
无论如何,它看起来像下面这样的东西可能是有用的:
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列表并避免递归函数时,加入它也很有用。在左连接中,结果中将丢弃不符合左表要求的空结果。