2009-09-15 82 views
57

Tôi đang cố gắng theo dõi một số SQL trong Microsoft Server. Tôi bắt gặp một sự tham gia đang sử dụng một quy ước không quen thuộc với tôi. "=*" có nghĩa là gì?= * có nghĩa là gì?

WHERE table1.yr =* table2.yr -1 
+47

có nghĩa là: viết lại cho tôi cú pháp sql mới! –

+5

Nếu bạn đủ tuổi để nhớ cú pháp ... –

+31

anh ấy đang gửi cho bạn một nụ hôn –

Trả lời

71

này:

WHERE t.column =* s.column 

... là cũ TSQL (pre SQL Server 2005) bên ngoài tham gia cú pháp, và không phải là một ANSI JOIN.

tham khảo: SQL Server 2005 Outer Join Gotcha

+10

Về mặt kỹ thuật, đó là trước SQL Server 7. – Dave

+1

Ngoài ra, như của SQL Server 2012, không có cách nào bạn có thể sử dụng cú pháp này, vì chúng đã giảm Chế độ tương thích phiên bản 80. Đây là một điều tốt. –

16

Đây là cú pháp phong cách cũ để thể hiện tham gia

+2

Ai đó là đại diện đói ... –

+2

@victor hugo Tôi vẫn là một người mới ở đây, hãy tử tế. Thành thật mà nói, tôi xếp hàng đầu tiên, chỉ cố gắng giúp đỡ. Phần buồn cười, và tôi phát hiện ra điều này một cách vô tình, là chúng ta có được nhiều đại diện cho những người không có trí tuệ hơn là những câu hỏi khó khăn hơn nhiều. BTW tại sao bạn nên trêu chọc _me_ về điều này, so với những người trả lời sau đó với đại diện cao hơn/thành viên SO dài hơn? – mjv

+0

@mjv: Tôi nghĩ rằng Vitor đã trêu chọc tôi thực sự. –

25

Tôi tin rằng đó là cú pháp cũ chỉ ra một điều kiện tham gia bên ngoài từ table1 để table2

Cũ phong cách:

SELECT * FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

mới kiểu (SQL92):

SELECT * FROM table2 
LEFT OUTER JOIN table1 ON table1.yr = table2.yr - 1 
+2

Thực ra ví dụ của bạn không chính xác. Nếu bạn thực sự muốn sử dụng một tham gia bên ngoài bên trái nó sẽ được SELECT * FROM ** table2 ** LEFT OUTER JOIN ** table1 ** ON table1.yr = table2.yr-1 – Turismo

+0

@Turismo - tốt bắt! đã chỉnh sửa câu trả lời của tôi để sửa lại. –

1

A ??? phép nối ngoài được xác định bằng ký hiệu = * thay cho = trong mệnh đề WHERE.

+0

Dừng downvoting tôi, ngôi sao trên RIGHT có nghĩa là bên này có thể chứa null. Nó là tham gia bên ngoài LEFT. – alex

+0

Câu hỏi đặt ra "Liệu * = a LEFT hoặc RIGHT bên ngoài tham gia" không thể trả lời, bởi vì bạn có thể viết hoặc TỪ A, B ON Ac * = Bc hoặc TỪ A, B ON Bc * = Ac Toán tử giống nhau (* =), nhưng một là một phép nối ngoài LEFT và một là một phép nối bên ngoài RIGHT. Tuy nhiên, tôi nghĩ bạn đã sai, và dấu * nằm bên cạnh cột từ bảng ngoài, chứ không phải bảng bên trong. Đạo đức của lập luận là đây là cú pháp kinh khủng. Tôi thích câu trả lời của HLGEM nhất. –

+0

Tôi có thể nói với bạn từ thực sự đang thử nó (và cậu bé thật khó để viết cú pháp đó, rùng mình) rằng * = là phần nối trái. Cảm ơn những lời tốt đẹp Steve. – HLGEM

2

Đây là kiểu kết nối cũ không được dùng trong ANSI SQL92. cú pháp mới sử dụng bên trong và bên ngoài tham gia mà tham gia bảng dựa trên biểu thức chứ không phải là bình đẳng

0

yeap, đó là cú pháp khác cho một trái bên ngoài tham gia

 
from 
table1 left outer join table2 on table1.yr = table2.yr - 1 
+0

và nó cũng là một cú pháp khác cho một phép nối ngoài bên phải : từ bảng 2 bên phải bên ngoài tham gia table1 trên table1.yr = table2.yr - 1 –

6

Đó là ANSI SQL 1989 Cú pháp để RIGHT OUTER JOIN, nơi * = sẽ là LEFT OUTER JOIN.

Bạn cũng nên lưu ý rằng việc đặt cú pháp nối trong mệnh đề WHERE không được chấp nhận trong SQL 2008. http://scarydba.wordpress.com/2009/09/15/no-join-predicate/ < == Một bài viết kịp thời về điều này.

11

Điều đó có nghĩa là mã cần được thay thế ngay lập tức! Tham gia kiểu này được cho là tham gia đúng. Thật không may nó đôi khi sẽ được hiểu là một tham gia chéo, do đó, kết quả của việc sử dụng tham gia này có thể không chính xác. Ngoài ra, cú pháp này không được chấp nhận và không thể được sử dụng trong phiên bản tiếp theo của máy chủ SQl.

+4

Đối với bất cứ ai downvoted này, tôi nói điều này bởi vì mã hiện tại là bởi bất kỳ tiêu chuẩn không chính xác như kết quả chính xác không thể được đảm bảo ngay cả khi xa trở lại như SQL Server 2000. Nó thậm chí còn nói rằng mã này có kết quả không phù hợp trong sách trực tuyến cho SQL Server 2000.Để lại nó là cơ sở mã sẽ là nguy hiểm và không chuyên nghiệp. – HLGEM

-1

Có rất nhiều câu trả lời ngớ ngẩn ở đây. Bạn không đưa ra mệnh đề FROM, vì vậy không có cách nào để biết liệu * = của bạn đại diện cho một LEFT hay một phép nối ngoài RIGHT.

WHERE table1.yr =* table2.yr -1 

là cú pháp cũ để tham gia bên ngoài, chắc chắn. Nhưng bất cứ ai tuyên bố để biết liệu đó là một tham gia bên ngoài trái hoặc bên phải là nhầm lẫn. Nó phụ thuộc vào thứ tự trong đó table1 và table2 được đặt tên trong mệnh đề FROM, và điều đó không được đưa ra.

+0

No. * Biểu thị bảng nào được giữ nguyên, vì vậy trong bảng ví dụ 2 này được giữ nguyên. – JosephStyons

+0

Có, bảng 2 được bảo quản. Tôi không nói khác. Nhưng bạn vẫn không thể nói cho tôi biết đây là một LEFT tham gia hoặc tham gia một RIGHT, bạn có thể? –

+0

Trong cú pháp cũ thường sử dụng điều kiện kết nối để xác định bảng nào được coi là TRÁI và là RIGHT. Thứ tự trong mệnh đề FROM không liên quan. – Turismo

0
SELECT * 
FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

Có nghĩa là điều tương tự như thế này:

SELECT * 
    FROM 
    table2 
    LEFT OUTER JOIN 
    table1 
    ON table1.yr = (table2.yr - 1) 

The * syntax is considered outdated, và không phải là phù hợp với các tiêu chuẩn ANSI.

Oracle has a similar construct như thế này:

WHERE table1.yr (+)= table2.yr 
+1

Thực ra cú pháp Oracle là một cách khác. Dấu (+) nằm ở bên cạnh bảng bên trong (hoặc tùy chọn), nhưng ngôi sao nằm ở bên cạnh của bảng ngoài. Vì vậy table1.yr = * table2.yr sẽ là table1.yr (+) = table2.yr – Turismo

+0

có, bạn hoàn toàn đúng. Cảm ơn! – JosephStyons

0

Để có đồng bằng và đơn giản. Đây là toán tử nối ngoài SQL-92 (more info)

Không dùng nó, trường cũ của nó, nhưng nó tương tự như LEFT JOIN và RIGHT JOIN. Tất cả việc làm của nó là cho biết bên tham gia nào là bên "Phụ huynh", vì vậy các hàng ở bên đó sẽ được xem xét trước tiên.

Nếu bạn cố gắng chạy điều này trên SQL 2005, nó sẽ ném một lỗi, nói rằng bạn cần phải chạy điều này trong chế độ tương thích.