Truy vấn công việc thực tế của tôi là một phép nối bên trong, nhưng ví dụ đơn giản này với phép nối chéo dường như luôn luôn tái tạo vấn đề.
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT NEWID() TEST_ID
) BB ( B )
Với phép nối bên trong của tôi, tôi đã có nhiều hàng mà tôi đã thêm vào mỗi GUID bằng hàm NEWID () và trong khoảng 9 trên 10 hàng như vậy, phép nhân với bảng ảo 2 hàng tạo ra kết quả như mong đợi, chỉ 2 bản sao cùng một GUID, trong khi 1 trên 10 sẽ tạo ra kết quả khác nhau. Điều này thật bất ngờ để nói ít nhất và đã cho tôi một thời gian thực sự khó khăn khi cố gắng tìm ra lỗi này trong kịch bản tạo dữ liệu thử nghiệm của tôi.
Nếu bạn xem các truy vấn sau bằng cách sử dụng các hàm getdate và sysdatetime không xác định, bạn sẽ không thấy điều này, dù sao tôi cũng không thấy - tôi luôn thấy cùng một giá trị thời gian trong cả hai hàng kết quả cuối cùng.
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT GETDATE() TEST_ID
) BB ( B )
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT SYSDATETIME() TEST_ID
) BB ( B )
Tôi hiện đang sử dụng SQL Server 2008 và công việc của tôi hiện tại là tải các hàng của tôi với GUID vào một biến bảng trước khi hoàn thành tập lệnh tạo dữ liệu ngẫu nhiên của tôi. Khi tôi có chúng dưới dạng các giá trị trong một bảng trái ngược với bảng ảo, vấn đề sẽ biến mất.
Tôi có một cách giải quyết, nhưng tôi đang tìm cách để giải quyết mà không có các bảng hoặc biến bảng thực tế.
Trong khi viết điều này, tôi đã thử nhưng không thành công những khả năng này: 1) đặt newid () vào một bảng ảo lồng nhau:
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT TEST_ID
FROM (
SELECT NEWID() TEST_ID
) TT
) BB ( B )
2) gói newid () trong một biểu thức cast, chẳng hạn như:
SELECT CAST(NEWID() AS VARCHAR(100)) TEST_ID
3) đảo ngược thứ tự xuất hiện của các bảng ảo trong biểu thức nối
SELECT *
FROM (
SELECT NEWID() TEST_ID
) BB ( B )
CROSS JOIN (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
4) sử dụng chéo không tương thích
SELECT *
FROM (
SELECT NEWID() TEST_ID
) BB ( B )
CROSS APPLY (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
Ngay trước khi cuối cùng đăng câu hỏi này, bây giờ tôi đã thử nó với thành công, có vẻ như một ứng dụng chéo tương quan:
SELECT *
FROM (
SELECT NEWID() TEST_ID
) BB ( B )
CROSS APPLY (
SELECT A
FROM (
SELECT 1 UNION ALL
SELECT 2
) TT ( A )
WHERE BB.B IS NOT NULL
) AA ( A )
Bất cứ ai có cách giải quyết khác đơn giản hơn, thanh lịch hơn? Tôi thực sự không muốn sử dụng áp dụng chéo hoặc tương quan cho phép nhân hàng đơn giản nếu tôi không phải làm vậy.