PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   詢問SQL語法問題XD..... (https://www.pcdvd.com.tw/showthread.php?t=1153782)

vxr 2018-10-31 12:07 PM

詢問SQL語法問題XD.....
 
應該可以問吧...:ase

請問以下這種語法是有效的嗎?
SELECT *
FROM A, B
ON A.id=B.id;

有人見過在某個SQL DB或著以前某個古老的SQL parser可以通過的?..:confused:...

我的理解是FROM取得的資料來源生成VT1後(cartesian product)..
通過ON匹配後再生成VT2..

可是這語法真的是有效的嗎?...
對SQL標準不熟...:laugh:

還是以前某個古老的SQL標準(ANSI)允許這種方式??...:confused:

冰的啦魔王大人 2018-10-31 12:48 PM

引用:
作者vxr
應該可以問吧...:ase

請問以下這種語法是有效的嗎?
SELECT *
FROM A, B
ON A.id=B.id;

有人見過在某個SQL DB或著以前某個古老的SQL parser可以通過的?..:confused:...

我的理解是FROM取得的資料來源生成VT1後(cartesian product)..
通過ON匹配後再生成VT2..

可是這語法真的是有效的嗎?...
對SQL標準不熟...:laugh:

還是以前某個古老的SQL標準(ANSI)允許這種方式??...:confused:


這個是你要的?

https://stackoverflow.com/questions...multiple-tables

vxr 2018-10-31 12:57 PM

引用:
作者冰的啦魔王大人

小弟不是問這種顯式的JOIN語句...:ase

FROM 後面直接接ON..
這種語句形式在某些SQL DB或著某個古老的SQL標準是有效的嗎?..:confused:..
有人有見過嗎?..

還是他根本是錯誤的???

michelle-lai529 2018-10-31 12:59 PM

引用:
作者vxr
應該可以問吧...:ase

請問以下這種語法是有效的嗎?
SELECT *
FROM A, B
ON A.id=B.id;

有人見過在某個SQL DB或著以前某個古老的SQL parser可以通過的?..:confused:...

我的理解是FROM取得的資料來源生成VT1後(cartesian product)..
通過ON匹配後再生成VT2..

可是這語法真的是有效的嗎?...
對SQL標準不熟...:laugh:

還是以前某個古老的SQL標準(ANSI)允許這種方式??...:confused:


印象很淺,好像是不宣告結合方式的話,是使用INNER JOIN結合

不確定有沒有記錯。

stylus 2018-10-31 01:01 PM

引用:
作者vxr
應該可以問吧...:ase

請問以下這種語法是有效的嗎?
SELECT *
FROM A, B
ON A.id=B.id;



我這樣用是沒有問題

SELECT *
FROM A, B
WHERE A.id=B.id;

vxr 2018-10-31 01:12 PM

引用:
作者stylus
我這樣用是沒有問題

SELECT *
FROM A, B
WHERE A.id=B.id;

這是以前JOIN的老用法...
用WHERE搭=, *=, =* ...
以前在很老的教科書有看過...

但是*=和=*這兩種運算子現在大多SQL parser應該都不給通過了吧...

嚐起來像雞 2018-10-31 04:39 PM

引用:
作者vxr
這是以前JOIN的老用法...
用WHERE搭=, *=, =* ...
以前在很老的教科書有看過...

但是*=和=*這兩種運算子現在大多SQL parser應該都不給通過了吧...


*= =* 看都沒看過啊 :laugh:

mickmail99 2018-10-31 08:53 PM

SELECT *
FROM A, B
WHERE A.id=B.id;
這是標準的,不過就是要用where 不是on,這樣sql92標準,

oracle 有用 A.id=B.id(+) 就是了

vxr 2018-10-31 09:36 PM

在詢問一下..
有兩張資料表..
Customers和Orders

假設
SELECT COUNT(custid)
FROM Customers;
計算出來的結果有91

然後下面敘述是這樣
SELECT c.custid,
c.companyname,
o.orderid
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid=o.custid AND c.city='Paris';
有人上過M$的課程應該有看過這個SQL statement..
(這個敘述我相信confuse很多學習者..)
在現代的SQL parser, ON與JOIN通常都是成對出現的...

我的理解是這樣的
1. 先掃描FROM取得主表(Customers)來源生成VT1. (從前面知道Customers有91筆)

2. SQL Engine剖析到OUTER JOIN.
上述SQL語句是LEFT JOIN, 取得匹配出來的結果,
然後把從ON語句條件中從VT1沒有匹配到LEFT JOIN右表(right table; Orders)的那些VT1紀錄補回去.
我先用早期的INNER JOIN來看, 先得知匹配成功的結果
SELECT c.custid,
c.companyname,
o.orderid
FROM Customers c, Orders o
WHERE c.custid=o.custid AND c.city='Paris';

74 Customer YSHXL 10738
74 Customer YSHXL 10907
74 Customer YSHXL 10964
74 Customer YSHXL 11043

回傳四筆結果, 他們都是同一個custid..
因此, (91-1)+4=94. 這是從右表沒有匹配成功的紀錄(90)加上匹配成功的紀錄(4)的總資料數量

3. 生成VT2, 將94筆填進去傳回

4. 根據SELECT從VT2篩選, 生成VT3傳回

求SQL大佬看一下我這個理解是否正確???...:confused:...


所有的時間均為GMT +8。 現在的時間是03:48 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。