2017-03-02 46 views
0

我在这里有一些带有长字段的表的数据库模式(类型为“text”的MS-SQL-Server,类型为“text”的Sybase)也需要检索不同的行。与长列不同

这些表看起来像

create table node (id int primary key, … a few more fields … data text); 
create table ref (id int primary key, node_id int, … a few more fields); 

对于“节点”一列,有可能在“REF”零个或多个行。

现在我有一个像

SELECT node.* FROM node, ref WHERE node.id = ref.node_id AND ... some more restrictions. 

查询时,没有比在“参考”单行一些“NODE_ID”更该查询返回二倍体和三倍。

但我需要独特的行!

使用SELECT DISTINCT node.*不会因为类型的列

工作“文本” :-(在Sybase有绝招,只是说“的node.id GROUP”添加到查询,瞧!你得到唯一的行返回。

是否有MS-SQL-Server中的某些类似简单的一招?

我已经使用临时表的解决方案,但是这似乎是慢了很多,也许其原因仅仅是数量较大的,因为的陈述转移到数据库中?

+1

[不良习惯踢:使用旧样式的JOIN(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick -using-old-style-joins.aspx) – SqlZim

+1

['text' is deprecated](http://stackoverflow.com/a/564823/2333499),已经有很多年了 – SqlZim

+0

将该列转换为(n)varchar并在该组上进行分组。它可能会很慢,虽然... – Jeremy

回答

0

看起来你正从错误的方向接近这个问题。连接通常用于扩展在相关数据存储在不同表中的键上。所以,每个node_id获得多于一行并不奇怪。

在您的查询中,您将两个表连接在一起,但是您忽略了ref中的所有内容。看起来你只是试图从节点中过滤掉没有在ref中引用的id。如果是这种情况,那么你不想使用连接。下面将运行得更好

select * 
    from node 
    where id in (
     select node_id 
      from ref 
      where [any restrictions placed on the ref table go here] 
    ) 
     and [any restrictions placed on the node table go here] 

此外,在教你坏加入做法的风险,同样的事情可以完成他们的方式,你试图原来做,但它是更痛苦的编写和它不是好的做法

select node.col1, node.col2, ... , node.last_col 
    FROM node 
    inner join ref on node.id = ref.node_id 
    where [some restrictions.] 
    group by node.col1, node.col2, ... , node.last_col 
+0

是的。这可能是答案。我的问题有点复杂。这是真正的旧软件,它是从我从未见过的人写的,部分软件来自80年代后期,它有自己的查询语言,它被翻译成SQL语句。我需要调查是否可以足够深地嵌套这样的选择语句,或者如果我需要混合使用嵌套选择和连接。最小副作用的最简单方法是像Sybase这样的GROUP BY。 – Wurgl

+0

继承旧软件总是很粗糙,尤其是当它用过时的语言编写时。有时我必须用这种叫做Visual FoxPro的旧语言进行编码,这种语言在9年前停止了支持;试想想找到有用的文档,哈哈。无论如何,我希望这个查询适合你。 – KindaTechy