我有2个表,我想从表1中的列中获取值,并在结果表的2个不同列中显示它。这是表格。
table1
id name email
1 | James | aaaa@a.com
2 | John | bbbb@b.com
3 | Jack | cccc@c.com
表2:
id name xID yID
1 | Opqr | 1 | 2
2 | Pqrs | 2 | 3
3 | Qrst | 3 | 1
4 | Rstu | 2 | 1
现在我想得到像这样的结果
name xName yName
Opqr | James | John
Pqrs | John | Jack
Qrst | Jack | James
Rstu | John | James
有两个条件,xName的table1.id = table2.xID和yName的table1.id = table2.yID。我如何得到结果?
我试过
select table2.name, table1.name as xName, table1.name as yName
from table1 inner join table2
on table1.id=table2.xid and table1.id=table2.yid
但它给了0行。我还在学习sql,并且很难理解连接章节。我不确定要搜索哪个关键字,所以如果这个问题在某个地方已经有了答案,请提供链接。谢谢。
答案 0 :(得分:2)
这是另一个答案
SELECT t2.name, tx.name as xname, ty.name as yname
FROM t2
JOIN t1 AS tx
ON t2.xID = tx.id
JOIN t1 AS ty
ON t2.yID = ty.id;
即使名称来自同一个表,如果我们以面向对象的方式考虑这个,那么在t2中“交互”的名称将是两个对象之间的比较。我们需要将对象id
与xID
或yID
进行比较,然后打印出与匹配相关联的名称。这是一个很好的迹象,表明我们需要将对象表(t1
)与自身连接起来,每个事物都要进行比较。
现在,回到SQL中,有几种方法可以做到这一点,你当然可以将这个表的交叉产品与自身结合起来,然后过滤掉你想要的东西。
这可能类似于
SELECT *
FROM t2, t1 x, t1 x;
这将给出每个组合(在此示例中为36行)
(如下所示)
| id | name | xID | yID | x.id | x.name | x.email | y.id | y.name | y.email |
|----+------+-----+-----+------+--------+------------+------+--------+------------|
| 1 | Opqr | 1 | 2 | 1 | James | aaaa@a.com | 1 | James | aaaa@a.com |
| 1 | Opqr | 1 | 2 | 1 | James | aaaa@a.com | 2 | John | bbbb@b.com |
| 1 | Opqr | 1 | 2 | 1 | James | aaaa@a.com | 3 | Jack | cccc@c.com |
| 1 | Opqr | 1 | 2 | 2 | John | bbbb@b.com | 1 | James | aaaa@a.com |
然后我们会筛选出与我们正在寻找的匹配的组合。
SELECT *
FROM t2, t1 x, t1 y
WHERE xID = x.id
AND yID = y.id;
这只会向我们提供我们正在寻找的所有可能行的行。
| id | name | xID | yID | x.id | x.name | x.email | y.id | y.name | y.email |
|----+------+-----+-----+------+--------+------------+------+--------+------------|
| 1 | Opqr | 1 | 2 | 1 | James | aaaa@a.com | 2 | John | bbbb@b.com |
| 2 | Pqrs | 2 | 3 | 2 | John | bbbb@b.com | 3 | Jack | cccc@c.com |
| 3 | Qrst | 3 | 1 | 4 | Jack | cccc@c.com | 1 | James | aaaa@a.com |
| 4 | Rstu | 2 | 1 | 2 | John | bbbb@b.com | 1 | James | aaaa@a.com |
我们正在寻找的行。现在只需在SELECT
中过滤出您想要的列。或者我们可以清理一下。我们不需要WHERE
条款。这正是联接中ON
的用途。因此,我们将使用两个使用ON
子句的JOIN替换表交叉产品,并将解决方案放在顶部。
答案 1 :(得分:0)
试试这个,
select t2.name,t1.name as xName, t3.name as yName
from table2 t2
left join table1 t1 on t2.xid = t1.id
left join table1 t3 on t2.yid = t3.id;
答案 2 :(得分:0)
几乎正确,第一个名字和第二个名字是不同的,所以你应该有2个连接,分别引用表1
select table2.name, A1.name as xName, B1.name as yName
from table2
inner join table1 A1 ON A1.id=table2.xid
inner join table1 B1 ON B1.id=table2.yid
答案 3 :(得分:0)
SELECT T2.name, TX.name AS TX , TY.name AS TY FROM Table2 T2
LEFT JOIN Table1 AS TX ON TX.id=T2.xid
LEFT JOIN Table1 AS TY ON TY.id=T2.yid
我已根据上述查询获得所需的输出,以下是答案
Opqr James John
Pqrs John Jack
Qrst Jack James
Rstu John James