2017-03-02 36 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