SQL笛卡尔连接

SQL笛卡尔连接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试一个记录的转换表和一个日期表 表A: date 2017-01-01 2017-01-02 2017-01-03 2017-01-04 表B: state | date_logged | requestno_i A 2017-01-01 req01 B 2017-01-03 req01 C 2017-01-04 req01 预期结果: date | state | date_logged | r

我正在尝试一个记录的转换表和一个日期表

表A:

date
2017-01-01
2017-01-02
2017-01-03
2017-01-04
表B:

state | date_logged | requestno_i
  A      2017-01-01      req01
  B      2017-01-03      req01
  C      2017-01-04      req01
预期结果:

   date      | state | date_logged | requestno_i
2017-01-01       A      2017-01-01      req01
2017-01-02       A      2017-01-01      req01
2017-01-03       B      2017-01-03      req01
2017-01-04       C      2017-01-04      req01
以下是我的尝试:

SELECT 
A.date,
B.state,
B.date_logged,
B.requestno_i
FROM   TABLE_A A CROSS JOIN TABLE_B B
WHERE requestno_i='req01' and A.date>=B.date_logged

一种方法是使用
交叉应用
而不是
交叉连接
。例如:

DECLARE @TableA TABLE ([Date] DATE);
INSERT @TableA ([Date]) VALUES ('2017-01-01'), ('2017-01-02'), ('2017-01-03'), ('2017-01-04');

DECLARE @TableB TABLE ([State] CHAR(1), Date_Logged DATE, RequestNo_i VARCHAR(10));
INSERT @TableB ([State], Date_Logged, RequestNo_i) VALUES ('A', '2017-01-01', 'req01'), ('B', '2017-01-03', 'req01'), ('C', '2017-01-04', 'req01');

SELECT A.[Date], B.[State], B.Date_Logged, B.RequestNo_i
FROM @TableA AS A
CROSS APPLY
(
    SELECT TOP 1 *
    FROM @TableB
    WHERE Date_Logged <= A.[Date]
    AND RequestNo_i = 'req01'
    ORDER BY Date_Logged DESC
) AS B;
DECLARE@TableA表([Date]Date);
插入@TableA([日期])值('2017-01-01')、('2017-01-02')、('2017-01-03')、('2017-01-04');
声明@TableB TABLE([State]CHAR(1),Date_Logged Date,RequestNo_i VARCHAR(10));
插入@TableB([状态]、记录日期、请求编号)值('A'、'2017-01-01'、'req01')、('B'、'2017-01-03'、'req01')、('C'、'2017-01-04'、'req01');
选择A.[日期]、B.[状态]、B.记录日期、B.请求否
从@tabla作为
交叉应用
(
选择前1名*
来自@TableB

当记录日期时,一种方法是使用
交叉应用
而不是
交叉连接
。例如:

DECLARE @TableA TABLE ([Date] DATE);
INSERT @TableA ([Date]) VALUES ('2017-01-01'), ('2017-01-02'), ('2017-01-03'), ('2017-01-04');

DECLARE @TableB TABLE ([State] CHAR(1), Date_Logged DATE, RequestNo_i VARCHAR(10));
INSERT @TableB ([State], Date_Logged, RequestNo_i) VALUES ('A', '2017-01-01', 'req01'), ('B', '2017-01-03', 'req01'), ('C', '2017-01-04', 'req01');

SELECT A.[Date], B.[State], B.Date_Logged, B.RequestNo_i
FROM @TableA AS A
CROSS APPLY
(
    SELECT TOP 1 *
    FROM @TableB
    WHERE Date_Logged <= A.[Date]
    AND RequestNo_i = 'req01'
    ORDER BY Date_Logged DESC
) AS B;
DECLARE@TableA表([Date]Date);
插入@TableA([日期])值('2017-01-01')、('2017-01-02')、('2017-01-03')、('2017-01-04');
声明@TableB TABLE([State]CHAR(1),Date_Logged Date,RequestNo_i VARCHAR(10));
插入@TableB([状态]、记录日期、请求编号)值('A'、'2017-01-01'、'req01')、('B'、'2017-01-03'、'req01')、('C'、'2017-01-04'、'req01');
选择A.[日期]、B.[状态]、B.记录日期、B.请求否
从@tabla作为
交叉应用
(
选择前1名*
来自@TableB

记录日期的位置2017-01-02如何属于A?表A包含日期列表2017-01-02如何与A或2017-01-01相关?或者您是否在填补空白?我猜(您没有以任何方式解释)您正在尝试填补“状态”之间的日期间隔。请确认并详细解释-不是clear@Nick.McDermaid这是正确的。2017-01-02如何属于A?表A包含日期列表2017-01-02如何与A或2017-01-01相关?或者您是否在填补空白?我猜(您没有以任何方式解释)您正在尝试填补“状态”之间的日期间隔。请确认并详细解释-不是clear@Nick.McDermaid这是正确的。