编写SQL查询,其中值映射到所有可能的值

时间:2009-05-26 22:31:41

标签: sql

我有一张桌子

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

5 个答案:

答案 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