如果表中不匹配,则从表中选择Sqlite

时间:2013-09-09 09:33:20

标签: sqlite

cmd.CommandText = @"SELECT * FROM tableA, tableB 
  WHERE tableA.someid = tableB.someid AND 
  UPPER(name) LIKE @name LIMIT 1";

cmd.Parameters.AddWithValue("@name", _name.ToUpper() + "%");

是否可以从tableA中选择名称匹配,即使tableA.someid = tableB.someid条件失败?目前,如果tableB没有匹配的someid但是匹配名称,则此查询不返回任何数据。

if tableA.someid = tableB.someid && UPPER(name) LIKE @name
    return all data from both tables

if tableA.someid != tableB.someid
    return all from tableA where UPPER(name) LIKE @name

2 个答案:

答案 0 :(得分:2)

如果您想加入两个表并获取不匹配的记录,则需要outer join

SELECT *
FROM tableA
LEFT JOIN tableB ON tableA.someid = tableB.someid
WHERE UPPER(name) LIKE @name
LIMIT 1

答案 1 :(得分:0)

您可以使用EXISTS检查条目,UNION SELECT加入两个结果:

SELECT * FROM tableA, tableB WHERE tableA.someid = tableB.someid UNION SELECT * FROM tableA WHERE NOT EXISTS (SELECT * FROM tableA, tableB WHERE tableA.someid = tableB.someid)

通过这种方式,您可以获得两个表中id匹配的值以及表A中表B中没有ma id的值的条目。

问题在于,两个联合选择必须具有相同数量的结果列。您可以通过手动指定列并填写null

来解决此问题

SELECT colA1, colA2, colB1, colB2 FROM tableA, tableB WHERE tableA.someid = tableB.someid UNION SELECT colA1, colA2, null, null FROM tableA WHERE NOT EXISTS (SELECT * FROM tableA, tableB WHERE tableA.someid = tableB.someid)