2012-08-27 25 views
0

我必须在现有的SQL数据库上构建应用程序,并且遇到了这种情况。在2个表之间加入查询,第一个带有几个字段,引用了另一个字段中的相同字段

有一个表(称之为T1),其中多个字段从另一个表(T2),其基本上是由仅2字段,IdName的参考值。因此,T2拥有不同性质和含义的数据,因为与其相关的T1中的字段具有非常不同的种类。 (这在我看来是一个不寻常的设计。)

我的问题:给定这种设计,我如何建立一个连接查询,以获得T2.Name与每个T1字段相关的值。

编辑

我能得到我想要的东西做每场一个查询:

SELECT t2.name AS name1 
FROM t1 
INNER JOIN t2 
ON t1.field1 = t2.id; 

SELECT t2.name AS name2 
FROM t1 
INNER JOIN t2 
ON t1.field2 = t2.id; 

SELECT t2.name AS name3 
FROM t1 
INNER JOIN t2 
ON t1.field3 = t2.id; 

但是,这完全是无稽之谈。那么,我怎样才能将所有这些打包在一个查询中?

+0

对于每个外键列表t2再次给它不同的别名。 –

+0

会[此](http://stackoverflow.com/a/12076322/1514813)没有帮助? – TheGeekZn

回答

1

您需要以alias参考t2得到相应的名字:

SELECT alias1.name AS name1, 
     alias2.name AS name2, 
     alias3.name AS name3 
    FROM t1 
INNER JOIN t2 alias1 
    ON t1.field1 = alias1.id 
INNER JOIN t2 alias2 
    ON t1.field2 = alias2.id 
INNER JOIN t2 alias3 
    ON t1.field3 = alias3.id; 

如果外键可以为空,您可能想要用左连接替换内层。

+0

谢谢,这正是我需要的。 –

+0

@GlauberRocha不客气:-) –

0

没有看到表结构,你可以做这样的事情:

SELECT t1.col1, 
    t1.col2, 
    t1.id as t1_id, 
    t2.id as t2_id, 
    t2.name as t2_name 
FROM t1 
INNER JOIN t2 
    ON t1.id = t2.id 

既然你要加入的表,你只会给不同的别名出现两个表中的列。根据您的更新

,你应该能够对那些3个查询合并到一个:

SELECT t2.name AS name1 
FROM t1 
INNER JOIN t2 
    ON t1.field1 = t2.id 
    OR t1.field2 = t2.id 
    OR t1.field3 = t2.id 
0

是否有任何理由,你不能使用你的加入手术室?所以:

SELECT t2.name AS name3 
FROM t1, t2 
WHERE t1.field1 = t2.id 
OR t1.field2 = t2.id 
OR t1.field3 = t2.id; 

如果由于某种原因,你不能,你可以使用UNION到所有查询的结果在一个单一的查询合并。我不知道你使用哪RDBMS但Postgres的你可以在这里找到的信息: http://www.postgresql.org/docs/8.3/static/queries-union.html

对于任何其他DBMS名称的快速谷歌和“联盟”应该给你你需要什么。

0

尝试这样的事情,

SELECT t2.name AS NAME1,
(情况下,当t1.field1 = t2.id然后 '类型1' 时t1.field2 = t2.id然后 '2型'其他 '类型3' 端)为
类型从T1
INNER JOIN T2 ON t1.field1 = t2.id
或 t1.field2 = t2.id
或t1.field3 = t2.id

相关问题