SQL连接难题
给定 及 我想得到这个结果集SQL连接难题,sql,join,Sql,Join,给定 及 我想得到这个结果集 datestable pricedate(k) 1/1/2009 1/2/2009 1/3/2009 1/4/2009 这是一个一次性转储,所以如果可以完成的话,我不介意创建中间临时表 FWIW,我不只是把这个问题抛在脑后,所以,我已经尝试了很多方法,但都无法让它发挥作用 短暂性脑缺血发作 我应该这样做 至少它可以在SQL Server下工作 SELECT syms.sym, pt.pricedate, syms.price FROM (SELECT DIST
datestable
pricedate(k)
1/1/2009
1/2/2009
1/3/2009
1/4/2009
这是一个一次性转储,所以如果可以完成的话,我不介意创建中间临时表
FWIW,我不只是把这个问题抛在脑后,所以,我已经尝试了很多方法,但都无法让它发挥作用
短暂性脑缺血发作
我应该这样做
至少它可以在SQL Server下工作
SELECT syms.sym, pt.pricedate, syms.price FROM
(SELECT DISTINCT sym, datestable.priceDate FROM priceTable, datestable) syms
LEFT JOIN priceTable pt on pt.priceDate = syms.priceDate
我应该这样做
至少它可以在SQL Server下工作。未经测试…关键观察,您似乎需要在每一天为每只股票指定一行
SELECT syms.sym, pt.pricedate, syms.price FROM
(SELECT DISTINCT sym, datestable.priceDate FROM priceTable, datestable) syms
LEFT JOIN priceTable pt on pt.priceDate = syms.priceDate
SELECT b.sym, b.pricedate, p.price
FROM
(
SELECT DISTINCT sym, pricedate
FROM pricetable CROSS JOIN datestable
) b /* base table */
LEFT JOIN pricetable p ON p.sym = b.sym AND p.pricedate = b.pricedate
ORDER BY b.pricedate, b.sym
“加入”的替代方案。。。“1=1”上的“交叉连接”:
SELECT k1.sym, k1,pricedate, k1.price
FROM DatesTable JOIN (SELECT DISTINCT(sym) FROM PriceTable) AS k1 ON 1 = 1
LEFT JOIN Pricetable AS pt
ON (k1.pricedate = pt.pricedate AND k1.sym = pt.sym)
ORDER BY k1.sym DESC, k1.pricedate;
未经测试…关键观察,您似乎需要在每一天为每只股票创建一行
SELECT b.sym, b.pricedate, p.price
FROM
(
SELECT DISTINCT sym, pricedate
FROM pricetable CROSS JOIN datestable
) b /* base table */
LEFT JOIN pricetable p ON p.sym = b.sym AND p.pricedate = b.pricedate
ORDER BY b.pricedate, b.sym
“加入”的替代方案。。。“1=1”上的“交叉连接”:
SELECT k1.sym, k1,pricedate, k1.price
FROM DatesTable JOIN (SELECT DISTINCT(sym) FROM PriceTable) AS k1 ON 1 = 1
LEFT JOIN Pricetable AS pt
ON (k1.pricedate = pt.pricedate AND k1.sym = pt.sym)
ORDER BY k1.sym DESC, k1.pricedate;
你试过了吗
SELECT k1.sym, k1,pricedate, k1.price
FROM DatesTable CROSS JOIN (SELECT DISTINCT(sym) FROM PriceTable) AS k1
LEFT JOIN Pricetable AS pt
ON (k1.pricedate = pt.pricedate AND k1.sym = pt.sym)
ORDER BY k1.sym DESC, k1.pricedate;
或
选择a.sym、a.pricedate、p2.price
选择p.sym、d.pricedate
从价格表p中选择不同的符号
交叉连接
日期稳定的
左联接价格表p2
在a.sym=p2.sym和a.pricedate=p2.pricedate上
交叉连接应该得到一个完整的符号和日期列表,然后再次左键连接到价格表,您应该得到那些有价格记录的列数据的其余部分。您尝试过吗
SELECT k1.sym, k1,pricedate, k1.price
FROM DatesTable CROSS JOIN (SELECT DISTINCT(sym) FROM PriceTable) AS k1
LEFT JOIN Pricetable AS pt
ON (k1.pricedate = pt.pricedate AND k1.sym = pt.sym)
ORDER BY k1.sym DESC, k1.pricedate;
或
选择a.sym、a.pricedate、p2.price
选择p.sym、d.pricedate
从价格表p中选择不同的符号
交叉连接
日期稳定的
左联接价格表p2
在a.sym=p2.sym和a.pricedate=p2.pricedate上
交叉连接应该得到一个完整的符号和日期列表,然后通过再次左键连接到价格表,您应该得到那些有价格记录的列数据的其余部分。这似乎有效:
select a.sym, a.pricedate, p2.price
(select distinct p.sym, d.pricedate
from pricetable p
cross join
datestable d )a
left join pricetable p2
on a.sym = p2.sym and a.pricedate = p2.pricedate
结果:
DECLARE @pricetable TABLE (sym VARCHAR(10), pricedate DATETIME, price INT)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/2/9', 33)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/3/9', 34)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/4/9', 35)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/2/9', 66)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/3/9', 65)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/4/9', 64)
DECLARE @datestable TABLE (pricedate DATETIME)
INSERT INTO @datestable (pricedate) VALUES('1/1/9')
INSERT INTO @datestable (pricedate) VALUES('1/2/9')
INSERT INTO @datestable (pricedate) VALUES('1/3/9')
INSERT INTO @datestable (pricedate) VALUES('1/4/9')
SELECT AllDates.sym, AllDates.pricedate, outerp.price
FROM
(
SELECT
d.pricedate,
p.sym
FROM
@datestable AS d
CROSS JOIN @pricetable AS p
GROUP BY
d.pricedate,
p.sym
) AllDates
LEFT OUTER JOIN @pricetable AS outerp ON
outerp.pricedate = AllDates.pricedate
AND outerp.sym = AllDates.sym
ORDER BY AllDates.sym, AllDates.pricedate
这似乎有效:
select a.sym, a.pricedate, p2.price
(select distinct p.sym, d.pricedate
from pricetable p
cross join
datestable d )a
left join pricetable p2
on a.sym = p2.sym and a.pricedate = p2.pricedate
结果:
DECLARE @pricetable TABLE (sym VARCHAR(10), pricedate DATETIME, price INT)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/2/9', 33)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/3/9', 34)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('msft', '1/4/9', 35)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/2/9', 66)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/3/9', 65)
INSERT INTO @pricetable (sym, pricedate, price) VALUES('ibm', '1/4/9', 64)
DECLARE @datestable TABLE (pricedate DATETIME)
INSERT INTO @datestable (pricedate) VALUES('1/1/9')
INSERT INTO @datestable (pricedate) VALUES('1/2/9')
INSERT INTO @datestable (pricedate) VALUES('1/3/9')
INSERT INTO @datestable (pricedate) VALUES('1/4/9')
SELECT AllDates.sym, AllDates.pricedate, outerp.price
FROM
(
SELECT
d.pricedate,
p.sym
FROM
@datestable AS d
CROSS JOIN @pricetable AS p
GROUP BY
d.pricedate,
p.sym
) AllDates
LEFT OUTER JOIN @pricetable AS outerp ON
outerp.pricedate = AllDates.pricedate
AND outerp.sym = AllDates.sym
ORDER BY AllDates.sym, AllDates.pricedate
这就是我对sql server中交叉连接的看法。呃,这就是我在sql server中对交叉联接的看法。我们必须希望优化器在进行交叉联接之前将SELECT DISTINCT下推到PriceTable,以避免出现大型中间表。我们必须希望优化器在进行交叉联接之前将SELECT DISTINCT下推到PriceTable,以避免出现大型中间表。有趣的是,顺序是从问题中显示的结果来看,似乎是向后的,而且似乎还需要b.sym DESC!:有趣-ORDER BY似乎与问题中显示的结果相反,而且似乎还需要b.sym DESC!: