SQL Union查询 - 多个表

时间:2014-03-07 22:21:36

标签: sql sql-server

我有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关联的文档。

我怀疑我正在解决这个问题。有什么想法吗?

3 个答案:

答案 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%'