一张表多个字段是另一张表的主键,求关联查询语句

时间:2022-11-22 15:00:20
现有
A表one two three三个字段
B表 id name 字段
A表的三个字段都是和B表的ID关联起来的。
请问如何查询才能在查询的时候查出A表one two three 这三个值为id的对应name呢?

8 个解决方案

#1


SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id

#2


引用 1 楼 sinat_28984567 的回复:
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢

#3


引用 2 楼 qq_37099025 的回复:
Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的

#4


引用 3 楼 sinat_28984567 的回复:
Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢

#5


引用 4 楼 qq_37099025 的回复:
Quote: 引用 3 楼 sinat_28984567 的回复:

Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢


额,还是不太懂你的意思,第一条select是啥意思?要是能给些测试数据最好了。
现在不知道数据啥样,但是可以这样试试。

SELECT DISTINCT * FROM (
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id)t






#6


引用 5 楼 sinat_28984567 的回复:
Quote: 引用 4 楼 qq_37099025 的回复:

Quote: 引用 3 楼 sinat_28984567 的回复:

Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢


额,还是不太懂你的意思,第一条select是啥意思?要是能给些测试数据最好了。
现在不知道数据啥样,但是可以这样试试。

SELECT DISTINCT * FROM (
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id)t







可以查出预期结果,谢谢。
模拟数据如下
A表: one:1 two:2 three:3
B表:
id:1 name:一号;
id:2 name:二号;
id:3 name:三号。

刚刚我的意思是执行SELECT B.name from B INNER JOIN A where A.one = B.id会出现四条“一号”。
有更合适的查询方式吗?

#7


和期望的结果有差距,无法进一步操作。
准确的说,想要的效果是查询结果是一条记录……能实现吗?
更正一下数据库结构:
A表:id、name、one、two、three
B表:id、name、parentid(B表自关联)

现在项目中的需求是,把所有的数据列表,每一条A记录占一行,A记录中one two three的位置显示为B表中对应的name。
请各位大神帮忙解答一下,谢谢!

#8


引用 7 楼 qq_37099025 的回复:
和期望的结果有差距,无法进一步操作。
准确的说,想要的效果是查询结果是一条记录……能实现吗?
更正一下数据库结构:
A表:id、name、one、two、three
B表:id、name、parentid(B表自关联)

现在项目中的需求是,把所有的数据列表,每一条A记录占一行,A记录中one two three的位置显示为B表中对应的name。
请各位大神帮忙解答一下,谢谢!



语句:
--测试数据
;WITH A(id,name,one,two,three)AS(
select 1,'A',1,2,3 UNION ALL
select 2,'B',3,4,5
),B(id,name)AS
(
SELECT 1,'id1' UNION ALL
SELECT 2,'id2' UNION ALL
SELECT 2,'id2' UNION ALL
SELECT 3,'id3' UNION ALL
SELECT 4,'id4' UNION ALL
SELECT 5,'id5' 
)
--测试数据结束
SELECT  id ,
        A.name ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.one = B.id
        ) AS one ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.two = B.id
        ) AS two ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.three = B.id
        ) AS three
FROM    A;


结果:
一张表多个字段是另一张表的主键,求关联查询语句

#1


SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id

#2


引用 1 楼 sinat_28984567 的回复:
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢

#3


引用 2 楼 qq_37099025 的回复:
Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的

#4


引用 3 楼 sinat_28984567 的回复:
Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢

#5


引用 4 楼 qq_37099025 的回复:
Quote: 引用 3 楼 sinat_28984567 的回复:

Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢


额,还是不太懂你的意思,第一条select是啥意思?要是能给些测试数据最好了。
现在不知道数据啥样,但是可以这样试试。

SELECT DISTINCT * FROM (
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id)t






#6


引用 5 楼 sinat_28984567 的回复:
Quote: 引用 4 楼 qq_37099025 的回复:

Quote: 引用 3 楼 sinat_28984567 的回复:

Quote: 引用 2 楼 qq_37099025 的回复:

Quote: 引用 1 楼 sinat_28984567 的回复:

SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id


谢谢,可以查询出相应字段的数据,但是会重复,请问是为什么呢


one、two、three这个三个字段的id值一样,读出来的那么一样。
或者id值不一样的有那么值一样的


不是的,您误会我的意思了,我举个例子,只执行第一条SELECT语句,就会出现4条一样的NAME。
大概知道是因为笛卡尔积的原因,可是不太明白应该怎么解决呢


额,还是不太懂你的意思,第一条select是啥意思?要是能给些测试数据最好了。
现在不知道数据啥样,但是可以这样试试。

SELECT DISTINCT * FROM (
SELECT B.name from B INNER JOIN A where A.one = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.two = B.id
UNION all 
SELECT B.name from B INNER JOIN A where A.three = B.id)t







可以查出预期结果,谢谢。
模拟数据如下
A表: one:1 two:2 three:3
B表:
id:1 name:一号;
id:2 name:二号;
id:3 name:三号。

刚刚我的意思是执行SELECT B.name from B INNER JOIN A where A.one = B.id会出现四条“一号”。
有更合适的查询方式吗?

#7


和期望的结果有差距,无法进一步操作。
准确的说,想要的效果是查询结果是一条记录……能实现吗?
更正一下数据库结构:
A表:id、name、one、two、three
B表:id、name、parentid(B表自关联)

现在项目中的需求是,把所有的数据列表,每一条A记录占一行,A记录中one two three的位置显示为B表中对应的name。
请各位大神帮忙解答一下,谢谢!

#8


引用 7 楼 qq_37099025 的回复:
和期望的结果有差距,无法进一步操作。
准确的说,想要的效果是查询结果是一条记录……能实现吗?
更正一下数据库结构:
A表:id、name、one、two、three
B表:id、name、parentid(B表自关联)

现在项目中的需求是,把所有的数据列表,每一条A记录占一行,A记录中one two three的位置显示为B表中对应的name。
请各位大神帮忙解答一下,谢谢!



语句:
--测试数据
;WITH A(id,name,one,two,three)AS(
select 1,'A',1,2,3 UNION ALL
select 2,'B',3,4,5
),B(id,name)AS
(
SELECT 1,'id1' UNION ALL
SELECT 2,'id2' UNION ALL
SELECT 2,'id2' UNION ALL
SELECT 3,'id3' UNION ALL
SELECT 4,'id4' UNION ALL
SELECT 5,'id5' 
)
--测试数据结束
SELECT  id ,
        A.name ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.one = B.id
        ) AS one ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.two = B.id
        ) AS two ,
        ( SELECT TOP 1
                    name
          FROM      B
          WHERE     A.three = B.id
        ) AS three
FROM    A;


结果:
一张表多个字段是另一张表的主键,求关联查询语句