我有两个表A
和B
,它们都有一个ObjectID
列。 A
在其他列中包含唯一列ColA
,B
包含唯一列ColB
。
我想分别根据ColA
和ColB
的一对给定值执行SELECT,这样如果在任一列中找到值,则返回ObjectID
的值在相应的表格中。如果找到两个值(即一个值在ColA
中找到而另一个在ColB
中找到),则返回两个表中的匹配ObjectID
(可能相同也可能不同) )。如果没有找到两列的值,则返回空/ null结果。
例如,给出如下表格
A
...| ObjectID | ColA |...
1 123
3 234
4 345
B
...| ObjectID | ColB |...
2 "abc"
3 "bcd"
5 "dce"
如果(1, 2)
的给定值为ColA
且1
的给定值为ColB
,则查询应返回"abc"
。
如果(3, 3)
的给定值为ColA
且234
的给定值为ColB
,则应返回"bcd"
。
如果(4, null)
的给定值为ColA
且345
的给定值为ColB
,则应返回"abcd"
。
如果(null, null)
的给定值为ColA
且1234
的给定值为ColB
,则应返回"abcd"
。
这可以通过单查询来实现吗?或者我是否需要从两个表创建所涉及列的视图,并使用视图进行SELECT?如果是这样,是否有任何性能考虑,因为这个查询可能会经常执行?
答案 0 :(得分:2)
只使用两个标量子查询(在SQLite中,当没有结果时它们返回NULL):
SELECT (SELECT ObjectID
FROM A
WHERE ColA = ?
) AS ResultA,
(SELECT ObjectID
FROM B
WHERE ColB = ?
) AS ResultB
答案 1 :(得分:-1)
在关系数据库方面是不可能的,而sql sql查询是单个操作,并且可以返回一些数据组合的结果(如果没有谈论任何sql编程,如游标,pl / sql,t-sql等)。由于你需要表格并且不想将它们组合在一起(你真的没有,你需要在一个查询中进行2次独立操作的2个结果)。
可能的组合是:
所以
可以达到条件:
如果ColA的给定值为234且ColB的给定值为“bcd”,则应返回(3,3)。
从[some alwais false a.x = b.y}上的[full]外部联接b中选择a.ObjectID,b.ObjectId,其中a.colA = v1和b.colB = v2
我可以达到条件:
如果ColA的给定值为345且ColB的给定值为“abcd”,则应返回(4,null)。
从a,b中选择a.ObjectID,b.ObjectId,其中a.colA = v1和b.colB = v2
无法达到:
因为sql中没有操作,返回所有空数据集。
可以达到条件:
因为笛卡尔积(交叉连接)和外连接是互斥的