结合不同表的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的笛卡尔连接计数。