0

我必须在现有的 SQL 数据库上构建一个应用程序,我遇到了这种情况。

有一个表(称为它T1),其中几个字段引用另一个表(T2)中的值,该表基本上仅由 2 个字段组成,Id并且Name. 因此,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;

但这是无稽之谈。那么如何将所有这些打包在一个查询中呢?

4

4 回答 4

1

您需要对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;

如果外键可以为空,您可能希望用左连接替换内部。

于 2012-08-27T11:34:08.873 回答
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
于 2012-08-27T10:43:59.393 回答
0

您有什么理由不能在您的联接中使用 OR 吗?所以:

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 名称和“UNION”的快速谷歌应该给你你所需要的。

于 2012-08-27T11:05:39.820 回答
0

尝试这样的事情,

SELECT t2.name AS name1,
(当 t1.field1 = t2.id 然后 'Type1' 当 t1.field2=t2.id 然后 'Type2' 否则 'Type3' 结束)作为 Type
FROM t1
INNER JOIN t2 ON t1.field1 = t2.id
或 t1.field2=t2.id
或 t1.field3=t2.id

于 2012-08-27T11:29:39.090 回答