0
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
4

2 回答 2

2

如果要连接两个表并获取不匹配的记录,则需要外部连接

SELECT *
FROM tableA
LEFT JOIN tableB ON tableA.someid = tableB.someid
WHERE UPPER(name) LIKE @name
LIMIT 1
于 2013-09-09T11:01:58.650 回答
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 匹配的两个表和表 B 中没有数学 id 的表 A 中获取值的条目。

一个问题是,联合的两个选择必须具有相同数量的结果列。您可以通过手动指定列并填写以下内容来解决它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)

于 2013-09-09T10:09:00.490 回答