2012-08-22 32 views
7

Đây là truy vấn được rút gọn về vấn đề lớn hơn của tôi, nhưng ý chính là tôi đang cố gắng tham gia vào bên trong để chọn nơi chọn được giới hạn bởi lựa chọn bên ngoài. Điều đó có thể không? Tôi nhận được một lỗi về multipart identifier S.Item và S.SerialNum trên lựa chọn bên trong.Bên trong tham gia vào câu lệnh chọn trong đó mệnh đề where của câu lệnh chọn bên trong tham chiếu đến lựa chọn bên ngoài?

Ý chính là điều này, chúng tôi phải nhóm theo mục/nối tiếp và truy vấn đủ lớn, chúng tôi không muốn quay lại và nhóm mọi thứ trong toàn bộ truy vấn cho lần tham gia nhỏ này.

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 
+1

Tôi không hoàn toàn chắc chắn những gì bạn đang yêu cầu ở đây .. nhưng từ vẻ của truy vấn đó, loại bỏ bên trong của bạn 'Ở ĐÂU W.Item .. .' khoản và bao gồm trong câu lệnh 'ON'. Tham gia bên trong sẽ tự động làm những gì nó xuất hiện mệnh đề 'WHERE' của bạn đang cố gắng làm .. – StuckAtWork

+0

Truy vấn bên ngoài của bạn không tham chiếu bất kỳ biến nào trong truy vấn bên trong. Vì vậy, nó chỉ hoạt động như một bộ lọc. Bạn có dự định đưa minSalesDate vào truy vấn bên ngoài không? –

+0

@GordonLinoff Tôi đã dự định bao gồm điều đó, rất tiếc. Tay gõ truy vấn. –

Trả lời

13

Có vẻ như bạn có tham chiếu JOIN sai địa điểm.

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 

Chỉnh sửa, dựa trên nhận xét của bạn về lọc, bạn có thể đặt một khoản WHERE về nội SELECT của bạn:

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 
+2

Ngoài ra 'SalesDate' không được trong' GROUP BY' và 'MIN (W.SalesDate)' cần một bí danh. –

+0

@MartinSmith cố định, cảm ơn – Taryn

+0

Vì vậy, tôi không thể đặt mệnh đề 'where' trong câu lệnh' select' bên trong? Mục đích là, một số kết quả có trạng thái "Đã hết hạn", vì vậy tôi đã thêm 'MIN (EXPIRED)' và đã thực hiện 'group by' trên nó, sau đó tham gia' ON EXPIRED = 0'. Tôi tự hỏi nếu có những người phức tạp hơn, nơi tôi sẽ không thể làm điều đó mặc dù. –

2

Bạn có thể thử một common_table_expression thay vì lệnh JOIN cũng có. Check the WITH clause here.

Nó có thể là một cái gì đó như thế này:

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 
+0

Tôi cũng sẽ cung cấp cho nó một shot. Tôi nghĩ rằng tôi đã nhận nó làm việc từ trên –

+0

Jot một lưu ý về kế hoạch thực hiện của giải pháp này: Kế hoạch của giải pháp này nên giống như giải pháp của greenfeet. (Vì vậy, trong nền nó là quá trình tương tự từ tối ưu hóa) Nhưng tôi nghĩ rằng tuyên bố này là dễ đọc hơn. –

+0

Tôi thích giải pháp dễ đọc hơn. Điều này có chậm hơn không? –

Các vấn đề liên quan