【发布时间】:2015-04-09 08:47:29
【问题描述】:
我正在执行连接,但我似乎无法使此 XOR 正常工作。
SELECT t1.COMPANY, t1.MILES,
CASE WHEN t2.MILES IS NULL THEN t3.MILES
ELSE t2.MILES
END AS MILES2,
CASE WHEN t2.MILES = t1.MILES AND t2.MILES != 9999 THEN t2.FLATRATE
ELSE t3.RATEBASIS
END AS RATE
FROM TABLE1 AS t1
LEFT JOIN TABLE2 AS t2
ON t1.[COMPANY] = t2.[COMPANYCODE] AND (t1.[MILES] = t2.[MILES])
INNER JOIN (
SELECT TOP 1 TRUCKERCODE, MILES, RATEBASIS, FLATRATE FROM TABLE2 WHERE MILES = 9999
) AS t3
ON t1.[COMPANY] = t3.[COMPANYCODE]
如果英里数相同,我需要加入 ON 子句,然后获取匹配的给定字段,否则我需要从第二个表中获取的默认数据是英里数等于 9999 的位置。现在使用那个 ON子句我得到许多额外的行,其中 MILES 等于 45,它从 TABLE2 获取数据,其中英里等于 45 和所有数据,其中英里等于 9999。我需要它来做一个或另一个,但不是两者都做。这就是我的桌子的样子
TABLE1 TABLE2
ID COMPANY MILES ETC ID COMPANYCODE MILES RATE
1 ILLINI 50 1 ILLINI 50 3.2
2 ILLINI 110 2 ILLINI 110 5.2
3 ILLINI 150 3 ILLINI 150 2.4
4 ILLINI 200 4 ILLINI 200 1.9
5 ILLINI 250 5 ILLINI 9999 1.5
6 ILLINI 300
7 ILLINI 350
8 ILLINI 400
9 ILLINI 450
10 ILLINI 500
Desired Output
COMPANY MILES MILES2 RATE
ILLINI 50 50 3.2
ILLINI 110 110 5.2
ILLINI 150 150 2.4
ILLINI 200 200 1.9
ILLINI 250 9999 1.5
ILLINI 300 9999 1.5
ILLINI 350 9999 1.5
ILLINI 400 9999 1.5
ILLINI 450 9999 1.5
ILLINI 500 9999 1.5
【问题讨论】:
-
为什么会从输出中排除,例如,
ILLINI 150 150 2.4? -
@GiorgosBetsos 我刚刚提供了一个快速版本。当然,这将包含在输出中。它将总共有 10 种不同的输出。我只是举个例子。
-
在 SQL Server 2000 中应用我的查询时是否遇到语法错误?
标签: sql join sql-server-2000 xor