2011-05-24 47 views
1

我有两个表,并希望根据从表参考ID来获得从表B technology_tag的第一次出现的一个:为了通过返回的结果

select b.dbid, b.technology_tag 
from tblConnect a, tblSites b 
where a.Site_DBID = 2 
and a.Related_Site_DBID = 1 
and (b.dbid = a.bsc_tag_dbid or b.dbid = a.related_bsc_dbid or b.dbid = a.related_msc_dbid) 

我想这里是命令基于返回的行(在where子句中)

1st- b.dbid = a.bsc_tag_dbid 
2cnd- b.dbid = a.related_bsc_dbid 
3rd- b.dbid = a.related_msc_dbid 

有没有人有线索如何做到这一点?

+3

我已经格式化了你的代码,所以有可能其他人可以阅读它。将来你应该自己做 - 使用代码按钮'{}'来标记代码,但也尽量不要在一行中出现过多。像上面这样的格式(这不是唯一可行的方法)使每个人(包括你自己在6个月的时间内)都更容易找到查询的单独的子句。 – 2011-05-24 14:27:18

回答

1

首先,在执行连接时,应切换到使用实际的JOIN子句。也就是说,这个ORDER BY子句应该做你想做的事:

SELECT 
    B.dbid, 
    B.technology_tag 
FROM tblConnect A 
INNER JOIN tblSites B ON 
    B.dbid IN (A.bsc_tag_dbid, A.related_bsc_dbid, A.related_msc_dbid) 
WHERE 
    A.Site_DBID = 2 AND 
    A.Related_Site_DBID = 1 
ORDER BY 
    CASE 
     WHEN B.dbid = A.bsc_tag_dbid THEN 1 
     WHEN B.dbid = A.related_bsc_dbid THEN 2 
     WHEN B.dbid = A.related_msc_dbid THEN 3 
     ELSE 4 -- Not really necessary, but I always use an ELSE when I use CASE 
    END 
+0

非常感谢,它的工作原理 – Ahmad 2011-05-24 15:00:32

+0

但查询现在需要很多时间来检索记录,你有什么想法吗? – Ahmad 2011-05-24 15:24:41

+0

首先,我将更改查询以使用正确的JOIN语法。然后确保您的表格已正确编制索引。根据您使用的特定RDBMS,它可能包括分析查询的工具,以查看它花费的最多时间。您还可以将OR语句更改为单个IN语句:'B.dbid IN(A.bsc_tag_dbid,A.related_bsc_dbid,A.related_msc_dbid)' – 2011-05-24 15:31:31