如果两个表的条​​件匹配,则从两个表中选择值

时间:2015-04-28 07:59:43

标签: sql sqlite

我有两个表AB,它们都有一个ObjectID列。 A在其他列中包含唯一列ColAB包含唯一列ColB

我想分别根据ColAColB的一对给定值执行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)的给定值为ColA1的给定值为ColB,则查询应返回"abc"

如果(3, 3)的给定值为ColA234的给定值为ColB,则应返回"bcd"

如果(4, null)的给定值为ColA345的给定值为ColB,则应返回"abcd"

如果(null, null)的给定值为ColA1234的给定值为ColB,则应返回"abcd"

这可以通过查询来实现吗?或者我是否需要从两个表创建所涉及列的视图,并使用视图进行SELECT?如果是这样,是否有任何性能考虑,因为这个查询可能会经常执行?

2 个答案:

答案 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个结果)。

可能的组合是:

  • 表的笛卡尔积 - 结果包含A的每一行与B的每一行连接,因此没有A的行没有B的行
  • join(inner / outer) - 结果包含由某些条件选择的A和B行的连接(两个表的某些子集中某些字段的值应相等)

所以

  1. 可以达到条件:

    • 如果ColA的给定值为1且ColB的给定值为“abc”,则查询应返回(1,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

  2. 我可以达到条件:

    • 如果ColA的给定值为345且ColB的给定值为“abcd”,则应返回(4,null)。

      从a,b中选择a.ObjectID,b.ObjectId,其中a.colA = v1和b.colB = v2

  3. 无法达到:

    • 如果ColA的给定值是1234并且ColB的给定值是“abcd”,它应该返回(null,null)。
  4. 因为sql中没有操作,返回所有空数据集。

    1. 可以达到条件:

      • 如果ColA的给定值为1且ColB的给定值为“abc”,则查询应返回(1,2)。
      • 如果ColA的给定值为234且ColB的给定值为“bcd”,则应返回(3,3)。
      • 如果ColA的给定值为345且ColB的给定值为“abcd”,则应返回(4,null)。
    2. 因为笛卡尔积(交叉连接)和外连接是互斥的