结合不同表的SQL select语句
假设我有三个表:结合不同表的SQL select语句,sql,sap-ase,Sql,Sap Ase,假设我有三个表:TableA,TableB,和TableC。每个表都有一列:ColA TableA是我的主表,TableA.ColA有一个值 我希望检查TableB或TableC的ColA中是否有一个值与我的TableA.ColA对应 因此,我的声明是: select count(*) from TableA, TableB, TableC where ( TableA.ColA = TableB.ColA AND TableA.ColA = "ABC") OR ( TableA.
TableA
,TableB
,和TableC
。每个表都有一列:ColA
TableA
是我的主表,TableA.ColA
有一个值
我希望检查TableB
或TableC
的ColA
中是否有一个值与我的TableA.ColA
对应
因此,我的声明是:
select count(*)
from TableA, TableB, TableC
where ( TableA.ColA = TableB.ColA AND TableA.ColA = "ABC")
OR ( TableA.ColA = TableC.ColA AND TableA.ColA = "ABC" )
但这是行不通的
如果我的TableB.ColA
没有ColA
值,而TableC.ColA
有值,则返回的结果仍然是0
。我应该得到一个1
的计数
我的select语句有什么问题
我的表格A数据:
ColA
-----
ABC
我的TableB数据:
ColA
----
NULL
我的TableC数据:
ColA
----
ABC
因为TableC.ColA
和TableA.ColA
具有相同的值,它应该返回我一个1
的计数。但事实并非如此。我的数据库是SAP ASE
谢谢您正在进行
内部联接
,您需要外部联接
或存在
。您使用的RDBMS的语法会有所不同
试试这个:
SELECT COUNT(*)
FROM
TableA A
WHERE
A.ColA = "Value"
AND (
EXISTS(
SELECT * FROM TableB
WHERE
ColA = "Value"
)
OR EXISTS(
SELECT * FROM TableC
WHERE
ColA = "Value"
)
)
选择计数(*)
从表格
左连接
表B
表A.ColA=表B.ColA
左连接
表C
表A.ColA=表C.ColA
其中TableA.ColA=“Value”
及
(TableB.ColA不为空或TableC.ColA不为空)
这里的想法是:
LEFT JOIN
,这样无论TableB
或TableC
是否有行,都会生成该行。如果其中一个或两者都没有,则相应的值将为NULL
WHERE
子句中至少有一行不为NULL
,筛选出TableB
和TableC
都没有这些值的行我不清楚你到底在数什么。您还必须向我们展示一些示例数据,以及查询这些数据时的预期结果。指定您使用的数据库总是很有用的。几乎总是指定数据库。对于这个问题,没关系。永远,永远,永远,在任何情况下都不会这样做。@MK和任何规则一样,也有例外,尽管非常罕见。哈哈。在OP提到Sybase之后,我写了同样的查询。使用这个解决方案和Ingaz的解决方案在性能上有什么不同?thanks@PangSerLark性能可能非常相似,但如果
TableB
或TableC
可以有多行ColA
,则结果(计数)将不同。EXISTS
版本将仅统计A记录,而LEFT JOIN
版本将统计A*B*C记录的数量,例如,如果A有3行,B有5行,C和7行,对于给定的ColA值,您将获得3*5*7=105的笛卡尔连接计数。