我在SQL中使用UNION有一个有趣的问题.
我的声明是这样的形式:
with tab as (
(select FldA, FldB From Table1A inner join Table1B on Field1A=Field1B)
UNION
(select FldA, FldB From Table2A inner join Table2B on Field2A=Field2B)
)
select * from tab
where FldA="XYZ"
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我只返回1行 - 这是不正确的.我只是通过评论UNION和第二个Select语句来验证它是不正确的:
with tab as (
(select FldA, FldB From Table1A inner join Table1B on Field1A=Field1B)
--UNION
--(select FldA, FldB From Table2A inner join Table2B on Field2A=Field2B)
)
select * from tab
where FldA="XYZ"
Run Code Online (Sandbox Code Playgroud)
如果我运行这个版本,我得到三行返回!我假设我做了一些愚蠢的事 - 但我无法想象.
我正在使用变量让我的SELECT以2种不同的"模式"运行:
DECLARE @Mode as Varchar(1) = 'A'
SELECT
CASE
WHEN @Mode = 'A'
THEN FieldABC * 2
ELSE FieldABC * 3
END AS FieldABC,
CASE
WHEN @Mode = 'A'
THEN FieldDEF
ELSE FieldGHI
END AS FieldJKL
WHERE
FieldABC BETWEEN 0 AND 100
Run Code Online (Sandbox Code Playgroud)
当我想运行SELECT的"B"版本时,我只需要更改变量值.一切正常.
我现在想要更改WHERE子句,因此它也依赖于变量:
IF @Mode = 'A' THEN
WHERE FieldABC > 0
ELSE
WHERE FieldABC < 0
END IF
Run Code Online (Sandbox Code Playgroud)
除此之外,这种语法在SQL中完全是无意义的!
如何WHERE根据相同的变量实现我的子句的两种不同风格- 或者SELECT在两种不同模式之间切换的其他简单方法?
我在Excel中编写了这个非常短的VBA宏,它将2个Range对象传递给我自己的Function.这是整个代码:
Sub Cmp()
Dim OneMatch As Boolean
Dim NoMatches As Integer
Dim OneCell, TwoCell As Range
For Each OneCell In Range("X030Pols").Cells
OneMatch = False: NoMatches = 0
For Each TwoCell In Range("X206Pols").Cells
TwoCell.Offset(0, 23).Value = 0
Next
For Each TwoCell In Range("X206Pols")
If TwoCell.Offset(0, 22).Value = "" Then
TwoCell.Offset(0, 23).Value = PolComp(OneCell, TwoCell)
If TwoCell.Offset(0, 23).Value > 0 Then
NoMatches = NoMatches + 1
End If
End If
Next
If NoMatches = 1 Then
TwoCell.Offset(0, 22).Value = OneCell.Offset(0, -1).Value
OneCell.Offset(0, …Run Code Online (Sandbox Code Playgroud) 我有2个单独的查询.
查询1:
With A as (Select P,Q,R from X union all Select P,Q,R from Y)
Insert into File1
Select * from A
Run Code Online (Sandbox Code Playgroud)
查询2:
With B as (Select S,T,U from Z)
Insert into File2
Select * from B
Run Code Online (Sandbox Code Playgroud)
我意识到,从逻辑上讲,我总是需要一起生成File1和File2,所以我决定将2个查询合并为一个存储过程.但是,当我尝试这样做时,我遇到了这个问题,它只能在查询中有一个WITH子句.
所以,我在SO中发现了一些问题,其中人们解释说你只是使用逗号并且有一个单独的WITH子句(尽管没有WITH)但是这对我的例子来说不适用于任何形式.
这不是问题 - 我很容易通过使用临时表等解决它.但我真的很感兴趣为什么我不能在同一个Proc中有两个完全不相关的WITH子句?
有人可以解释一下吗?