10

这是对我的更大问题的精简查询,但要点是我正在尝试内部连接到选择受外部选择限制的选择。那可能吗?我在内部选择中收到有关多部分标识符 S.Item 和 S.SerialNum 的错误。

要点是这样,我们必须按项目/序列进行分组,并且查询足够大,我们不想返回并将整个查询中的所有内容分组为这个小连接。

SELECT S.Item, S.SerialNum, S.ReceiveDate
    FROM SALES S
    INNER JOIN (SELECT W.Item, W.SerialNum, MIN(W.SalesDate)
                    FROM WARRANTY W
                    WHERE W.Item        = S.Item    AND
                          W.SerialNum   = S.SerialNum
                    GROUP BY Item, SerialNum, SalesDate) WW
        ON S.Item = WW.Item AND WW.SerialNum
4

2 回答 2

18

看起来你的JOIN参考资料放错了地方。

SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum

编辑,根据您对过滤的评论,您可以WHERE在您的 inner 上放置一个子句SELECT

SELECT S.Item, S.SerialNum, S.ReceiveDate, WW.MinSalesDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    WHERE yourFilter here
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum
于 2012-08-22T16:15:14.453 回答
2

您也可以尝试使用 common_table_expression 而不是 JOIN。在此处检查 WITH 子句。

它可能是这样的:

WITH Warranty_CTE (Item, SerialNum, MinSalesDate)
AS
(
 SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
)
SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN Warranty_CTE  WC
        ON S.Item = WC.Item 
       AND S.SerialNum = WC.SerialNum
于 2012-08-22T17:44:51.127 回答