Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL连接难题_Sql_Join - Fatal编程技术网

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!: