我有2个表(项目和文档),都有ID和名称字段。
我正在寻找符合以下要求的查询: - 它将从“名称”字段中的任何一个表中返回具有指定字词的行 - 它将返回3个字段:ID,Name和TableName - 其中tablename将是表的名称或某个标识符
我试过了:
SELECT id, name
FROM projects UNION SELECT id, name FROM documents
WHERE name like '%querystriong%'
但是这个查询没有添加第3个(TableName)字段,它返回Projects表中的行,这些行在名称字段中具有与querystring关联的文档。
我怀疑我正在解决这个问题。有什么想法吗?
答案 0 :(得分:5)
你的意思是这样的:
SELECT id, name, 'projects' AS table_name
FROM projects WHERE name like '%querystriong%' UNION SELECT id, name, 'documents' AS table_name
FROM documents WHERE name like '%querystriong%'
答案 1 :(得分:1)
将union中的每个select视为一个谨慎的查询,其结果集列必须匹配。这意味着如果要对每个查询进行过滤,则每个查询也必须具有WHERE子句。此外,您可以为每个查询添加一个文字,以说明它来自哪里。
这意味着您的查询应该是:
SELECT id, name 'projects' AS TableName FROM projects WHERE name like '%querystring%'
UNION
SELECT id, name, 'documents' AS TableName FROM documents WHERE name like '%querystring%'
或者,您可以将其表达为:
SELECT id, name, tablename FROM (
SELECT id, name, 'projects' as tablename
UNION
SELECT id, name, 'documents' as tablename
) AS combinedtable WHERE name like '%querystring%'
第二个选项可以让您更好地控制WHERE子句,因为您不需要复制它。
答案 2 :(得分:1)
我不确定我是否正确理解了问题,但此查询可能有所帮助:
SELECT id, name, 'projects' as tablename
FROM projects
WHERE name like '%querysting%'
UNION
SELECT id, name, 'documents'
FROM documents
WHERE name like '%querystring%'