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

编写SQL查询,其中一个值映射到所有可能的值,sql,Sql,我有一张桌子 A B 查询: 结果: 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.nu

我有一张桌子

A

B

查询:

结果:

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,如何:

SELECT A.name, B.marks FROM A, B WHERE A.num = 0 OR A.num = B.num
也许吧

您可能会发现这比带有OR的where子句更有效。虽然,老实说,你可能不知道,但是没有真正的方法可以避免以这种或那种方式扫描整个A和B。但查询规划者通常会有助于您拆分或将条件分解为工会

编辑:

我只是想在这个问题上做一点扩展。这样做可能有利的原因是,如果工会的两个部分从完全不同的方式中受益。例如,第二部分可以首先查找a中num=0的所有行,而第一部分可能更适合于对a进行完整扫描,并将索引查找/哈希查找合并到b中,或者合并anum和bnum上的索引

我还要说,这个查询是由可疑的设计引起的。不能将外键约束从anum放到bnum上,即使这样做是有意义的,因为a.num=0将不匹配b中的任何行。如果您在b中添加了num=0、marks=90和num=0、marks=40的行,那么您的查询可以通过简单的内部联接轻松编写。确实,这意味着为每个可能的标记保留两行,这可以通过使用触发器来完成,该触发器检测num值为非零值的插入,并在num=0时执行额外的插入。我想每种方法都有利弊。但我真的很喜欢将fkey约束放在数据库中,在这种情况下不使用它们会让我感到紧张-如果a中的记录得到的num不在b中,会发生什么?如果删除b中的一行,会发生什么情况

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)
选择a.名称,b.标记 从a到b 其中a.Num=b.Num或a.Num=0
+1、改变或转换为UNION或vv通常是一种有用的技术。
select A.name, B.marks from A,B where A.num = B.num or A.num=0;
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
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)