我有一张桌子
A
name num
------------
A 1
B 0
C 3
乙
num marks
---------------
1 90
3 40
查询:??
结果:
name marks
--------------
A 90
C 40
B 90
B 40
表A中的数字“0”对应于所有num列值。有没有办法写这个查询
我知道得到这个
name marks
--------------
A 90
C 40
我们可以这样做
select A.name, B.marks from A,B where A.num = B.num;
编辑:在这种情况下,0映射到num值1和3
答案 0 :(得分:5)
怎么样:
SELECT A.name, B.marks FROM A, B WHERE A.num = 0 OR A.num = B.num
答案 1 :(得分:2)
select a.name, b.marks from a join b on a.num = b.num
union all
select a.name, b.marks from a, b where a.num = 0
你可能发现这比带有“OR”的where子句更好。虽然,说实话,你可能没有,但没有真正的方法来绕过不得不以这种或那种方式扫描整个A和B.但查询规划者通常有助于将“OR”条件分解为联合。
编辑:
只是想稍微扩展一下。这样做可能有利的原因是,如果工会的两个部分受益于以完全不同的方式完成。例如,第二部分可以通过查找with(num = 0)中的所有行开始,而第一部分可能更适合于对a进行完整扫描并将索引查找/散列查找到b中,或者合并索引在a上(num)和b(num)。
我还会说这个问题来自于可疑的设计。你不能将(num)的外键约束放到b(num)上,即使它有意义,因为(a.num = 0)不匹配b中的任何行。如果在b中添加行(num = 0,marks = 90)和(num = 0,marks = 40),则可以使用简单的内连接轻松编写查询。虽然这是真的,但这意味着为每个可能的标记维护两行,这可以使用检测num的非零值插入的触发器来完成,并且使用num = 0进行额外的插入。我想每种方法都有利弊。但是我真的很喜欢在数据库中设置fkey约束,而在这样的情况下没有它们会让我感到紧张 - 如果a中的记录获得的数字不在b中会发生什么?如果b中的行被删除会发生什么?
答案 2 :(得分:0)
select A.name, B.marks from A,B where A.num = B.num or A.num=0;
可能?
答案 3 :(得分:0)
SELECT A.name
,B.marks
FROM dbo.so913112_A AS A
INNER JOIN dbo.so913112_B AS B
ON A.num = B.num
OR A.num = 0
给出:
name marks
---- -----------
A 90
B 90
B 40
C 40
(4 row(s) affected)
答案 4 :(得分:0)
select a.name,b.marks
from a,b
where a.Num=b.num or a.num=0