Sql-Server

T-SQL 中奇怪的 JOIN ON 子句

  • February 28, 2020

我正在整理一些遺留程式碼,但多年來我從未見過這樣的:

Select * 

FROM GLAccounts
INNER JOIN GLCharts
   ON glaGLChartID = glcGLChartID
LEFT JOIN GLCategories
   ON glcGLCategoryID = gltGLCategoryID
INNER JOIN GLDepartments
   ON glaGLDepartmentID = gldGLDepartmentID
INNER JOIN GLDivisions
   ON glaGLDivisionID = glvGLDivisionID
       ,GLFiscalYearPeriods                --<this comma>
INNER JOIN GLFiscalYears
   ON glfGLFiscalYearID = glzGLFiscalYearID


ORDER BY glcGLCategoryID
   ,glcParentGLChartID
   ,glaGLChartID

連接有效,但我在 ON 子句的任何 T-SQL 語法參考中都找不到這種逗號的使用。

這裡發生了什麼事?TIA

GLFiscalYearPeriods 是一個表,這個逗號表示交叉連接。(笛卡爾積)

該查詢似乎為每個會計年度返回了一些值。

鑑於此表:

create table a (id int, foo int);
create table c (id int);
insert into a values (1,1),(2,2),(3,3);
insert into c values (10),(20);

select * from a, c;

select * from a cross join c;
編號 | 富 | ID
-: | --: | -:
 1 | 1 | 10
 2 | 2 | 10
 3 | 3 | 10
 1 | 1 | 20
 2 | 2 | 20
 3 | 3 | 20

db<>在這裡擺弄

再舉一個例子:

create table a (id int, foo int);
create table b (id int, foo int);
create table c (id int);
create table d (id int);
insert into a values (1,1),(2,2),(3,3);
insert into b values (1,1),(2,2),(3,3);
insert into c values (10),(20);
insert into d values (1),(2);
select * from a join b on a.id = b.id       ,     c join d on d.id = a.id ;

消息 4104 級別 16 狀態 1 第 1 行

無法綁定多部分標識符“a.id”。

但如果你交叉加入它:

select * from a join b on a.id = b.id  cross join  c join d on d.id = a.id ;
編號 | 富 | 編號 | 富 | 編號 | ID
-: | --: | -: | --: | -: | -:
 1 | 1 | 1 | 1 | 10 | 1
 1 | 1 | 1 | 1 | 20 | 1
 2 | 2 | 2 | 2 | 10 | 2
 2 | 2 | 2 | 2 | 20 | 2

db<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/260768