如何从多个表中选择数据?

时间:2016-08-27 23:12:29

标签: java sql postgresql

我想在16个不同的表中搜索,但我不想重复“从DB中选择”16次;我认为这对性能没有帮助!!!

我正在使用:

query="SELECT * FROM table1, table2,..., table16 WHERE id=?";

这是正确的吗? 我的问题是如何分隔表的数据?

也许我可以从一张桌子获得一个“id”的两个或更多结果;所以我想知道哪个数据来自哪个表!! 。 最好的问候,

3 个答案:

答案 0 :(得分:1)

您的查询将无效,因为您正在尝试加入这些多个表,而您想要做的是搜索(过滤)这16个表。

您可以使用union all在单个查询中执行此操作:

select xxx, 'table1' as source_table
    from table1
where id = ?
union all
select xxx, 'table2' as source_table
    from table2
where id = ?

等等。第二个派生字段source_table可用于确定哪个表返回了哪个结果。

答案 1 :(得分:0)

您必须为具有相同名称的字段使用别名列出所有字段,并使用表名称作为前缀。

例如:

query = "SELECT table1.id as id_1, table2.id as id_2, ... WHERE id_1 = 23"

可能是一个非常长的查询,但您有解决方案来生成和粘贴它:您可以使用FlySpeed SqlQuery(免费供个人使用)执行此操作

FlySpeed SqlQuery将为您生成所有别名,并自动为表名添加前缀。

答案 2 :(得分:0)

稍微澄清会有所帮助。如果所有16个表都具有相同的字段,并且您希望它们位于连续列表中,则可以按照上面的建议使用UNION。另一方面,如果只有少数字段匹配,并且您希望并排比较每个表的值,则您将需要使用连接并为表名提供别名,如上所述。

但是,看一下你提供的代码片段,我猜你要么构建某种存储过程,要么用其他语言实现SQL。如果是这种情况,那么如何将表名加载到数组中并使用for循环来构建查询,例如以下伪代码:

tableList = ["table1", "table2"...]
fieldnames = ["field1", "field2"...]

query = "SELECT "

for i = 0 to count(tableList):
    for j = 0 to count(fieldnames):
         query = query + tablelist[i] + "." + fieldnames[j] + ", "
    j++
i++

query = query + "FROM " 

for i = 0 to count(tableList):
    query = query + tableList[i] + ", "
i++

query = query + "WHERE " ...

等等。这很大程度上取决于你想要做什么,你想要做多少次,以及变量(比如你正在使用哪些表或字段)的变化频率。

相关问题