比方說,我有一個表線外部WHERE子句如何影響嵌套查詢的執行方式?
b | a
-----------
17 7000
17 0
18 6000
18 0
19 5000
19 2500
我希望得到一個函數的正值:(a1 - a2) \ (b2 - b1)
在笛卡爾積的所有元素的線不同B的。 (如果你有興趣,這將導致線y1 = b1*x + a1
和y2 = b2*x + a2
交叉口)
我寫QUERY1爲事業
SELECT temp.point FROM
(SELECT DISTINCT ((l1.a - l2.a)/(l2.b - l1.b)) AS point
FROM lines AS l1
CROSS JOIN lines AS l2
WHERE l1.b != l2.b
) AS temp
WHERE temp.point > 0
它「被零除」錯誤拋出一個。我想同樣的查詢,而WHERE子句(QUERY2)和它工作得很好
SELECT temp.point FROM
(SELECT DISTINCT ((l1.a - l2.a)/(l2.b - l1.b)) AS point
FROM lines AS l1
CROSS JOIN lines AS l2
WHERE l1.b != l2.b
) AS temp
以及與定義的SQL函數(QUERY3)
CREATE FUNCTION get_point(@a1 DECIMAL(18, 4), @a2 DECIMAL(18, 4), @b1 INT, @b2 INT)
RETURNS DECIMAL(18, 4)
WITH EXECUTE AS CALLER
AS
BEGIN
RETURN (SELECT (@a1 - @a2)/(@b2 - @b1))
END
GO
SELECT temp.point FROM
(SELECT DISTINCT dbo.get_point(l1.a, l2.a, l1.b, l2.b) AS point
FROM lines AS l1
CROSS JOIN lines AS l2
WHERE l1.b != l2.b
) AS temp
WHERE temp.point > 0
我有變化一個直觀的假設,即外層SELECT不應該影響嵌套SELECT的方式(或者至少不應該打破它)。即使這不是真的,也不能解釋爲什麼查詢3工作時查詢1不。
有人可以解釋這背後的原理嗎?這將非常感激。
謝謝,現在一切都有意義 – ablclanmarazm