SQL select 语句结合不同的表
SQL select statement combining with different tables
假设我有三个 table:TableA
、TableB
和 TableC
。这些 table 中的每一个都有一列:ColA
.
TableA
是我的主要 table 并且 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
有值,结果 returned 仍然是 0
。我应该得到 1
的计数。
我的 select 陈述有什么问题?
我的表A数据:
ColA
-----
ABC
我的表B数据:
ColA
----
NULL
我的 TableC 数据:
ColA
----
ABC
因为TableC.ColA
和TableA.ColA
有相同的值,它应该return我数1
。但它并没有这样做。我的数据库是 SAP ASE
谢谢
您正在做 INNER JOIN
,您需要 OUTER JOIN
或 EXISTS
。语法会因您使用的 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"
)
)
select count(*)
from TableA
LEFT JOIN
TableB
ON TableA.ColA = TableB.ColA
LEFT JOIN
TableC
ON TableA.ColA = TableC.ColA
where TableA.ColA = "Value"
AND
(TableB.ColA IS NOT NULL OR TableC.ColA IS NOT NULL)
这里的想法是:
- 使用
LEFT JOIN
以便无论 TableB
或 TableC
是否有一行,都会生成该行。如果其中之一或两者都没有,则对应的值为 NULL
- 过滤掉
TableB
和 TableC
都没有这些值的行,方法是要求其中至少一个在 WHERE
子句中不是 NULL
。
假设我有三个 table:TableA
、TableB
和 TableC
。这些 table 中的每一个都有一列:ColA
.
TableA
是我的主要 table 并且 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
有值,结果 returned 仍然是 0
。我应该得到 1
的计数。
我的 select 陈述有什么问题?
我的表A数据:
ColA
-----
ABC
我的表B数据:
ColA
----
NULL
我的 TableC 数据:
ColA
----
ABC
因为TableC.ColA
和TableA.ColA
有相同的值,它应该return我数1
。但它并没有这样做。我的数据库是 SAP ASE
谢谢
您正在做 INNER JOIN
,您需要 OUTER JOIN
或 EXISTS
。语法会因您使用的 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"
)
)
select count(*)
from TableA
LEFT JOIN
TableB
ON TableA.ColA = TableB.ColA
LEFT JOIN
TableC
ON TableA.ColA = TableC.ColA
where TableA.ColA = "Value"
AND
(TableB.ColA IS NOT NULL OR TableC.ColA IS NOT NULL)
这里的想法是:
- 使用
LEFT JOIN
以便无论TableB
或TableC
是否有一行,都会生成该行。如果其中之一或两者都没有,则对应的值为NULL
- 过滤掉
TableB
和TableC
都没有这些值的行,方法是要求其中至少一个在WHERE
子句中不是NULL
。