查询结果
A字段查询出来,B字段跟在后面,B不够的用NULL,用left join可以,但如果B有10行时,A有1行时就不行了.有什么办法写呢?
20 个解决方案
#1
right join?看你要啥样的数据了。
以A为基准用left join 以B为基准用right
都要就用full join
以A为基准用left join 以B为基准用right
都要就用full join
#2
full join会多出一行数据
select * from a full join b on a.id=b.id
刚才测了,a一行数据,b两行数据,这样查询成了三行数据,
我要这样的数所,
a两行.一行是数据,一行全是空,b就两行数据
#3
如果两个表的表机构是相同的,对应的列也是相同的可以
union all解决。
如果不相同可以表的联结查询解决。
union all解决。
如果不相同可以表的联结查询解决。
#4
自然连接应该可以吧~
#5
左右连接,即可实现!不知道你想要什么样的结果
#6
表结果不同.就是想接到前面的表字段后面接着显示后面的表,显示成一个表格.而不是加入到一个表格的下面.左右联都试了不行.
#7
CREATE TABLE #a
(
ID INT,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
ID INT,
BTest NVARCHAR(200)
)
INSERT INTO #a( ID, aTest)VALUES(1,'A')
INSERT INTO #a( ID, aTest)VALUES(2,'A')
INSERT INTO #b( ID, BTest)VALUES(1,'B')
SELECT * FROM #a LEFT JOIN #b ON #b.ID = #a.ID
--这样的效果,但这里要怎么做,如果#a表是1行的#b有两行的话,这样就只有一条数据了.
想解决不管哪个表有多少条数据.以最多的的一个表为准,另一个表不够用NULL补上.如果只有用左右的话,如何动态转换呢?
#8
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B')
SELECT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
刚才测了一下,用这个方法,可是如何取消重复呢?
#9
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
#10
按你这样还是不行
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
#11
什么提示?我的怎么可以。
#12
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(20)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(20)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
B表有一条总复的数据
RiQi aTest RiQi BTest
---------- -------------------- ---------- --------------------
2013-06-11 A第二条 2013-06-11 B第一条
2013-06-11 A第一条 2013-06-11 B第一条
(2 行受影响)
#13
那我这边测试是正确的。我是SQL2000,不知道你是什么。要是别的版本我就不知道了。看你的数据类型我们的版本好像不一样。
2013-06-11 00:00:00.000 A 2013-06-11 00:00:00.000 B
(所影响的行数为 1 行)
2013-06-11 00:00:00.000 A 2013-06-11 00:00:00.000 B
(所影响的行数为 1 行)
#14
SELECT DISTINCT * FROM #a FULL OUTER JOIN #b ON #b.RiQi = #a.RiQi
全连接不就行了么
全连接不就行了么
#15
是一条也是不对的呀.A表有两条呀.你用一下12楼的测就知道了
#16
用这个也是一样的.
#17
以下可以达到你要的结果,但要满足一个假设条件: a,b 两表通过某一字段可以进行两表关联,而此字段在a,b两表中的数据中每行不能重复。
Select f.id, a.atest, b.btest
From (select id from tablea union select I'd from tableb) f left join tablea a on f.id =a.id
left join tableb b on f.id = b.id
Select f.id, a.atest, b.btest
From (select id from tablea union select I'd from tableb) f left join tablea a on f.id =a.id
left join tableb b on f.id = b.id
#18
A表,与B表没什么关联关系,就是把数据显示出来而已,同日的.
#19
那样的话,只能是根据日期和数据的自然输入顺序来连接两表了, 具体如下:
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
bTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
Select f.RiQi, a.aTest, b.BTest
From (select RiQi, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY aTest) AS Row from #a UNION select RiQi, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY bTest) AS Row from #b ) f
LEFT JOIN (select RiQi, aTest, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY aTest) AS Row from #a) a ON f.riqi = a.riqi AND f.row = a.row
LEFT JOIN (select RiQi, bTest, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY bTest) AS Row from #b) b ON f.riqi = b.riqi AND f.row = b.row
#20
我只是想说,我要改个头像....
#21
#1
right join?看你要啥样的数据了。
以A为基准用left join 以B为基准用right
都要就用full join
以A为基准用left join 以B为基准用right
都要就用full join
#2
full join会多出一行数据
select * from a full join b on a.id=b.id
刚才测了,a一行数据,b两行数据,这样查询成了三行数据,
我要这样的数所,
a两行.一行是数据,一行全是空,b就两行数据
#3
如果两个表的表机构是相同的,对应的列也是相同的可以
union all解决。
如果不相同可以表的联结查询解决。
union all解决。
如果不相同可以表的联结查询解决。
#4
自然连接应该可以吧~
#5
左右连接,即可实现!不知道你想要什么样的结果
#6
表结果不同.就是想接到前面的表字段后面接着显示后面的表,显示成一个表格.而不是加入到一个表格的下面.左右联都试了不行.
#7
CREATE TABLE #a
(
ID INT,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
ID INT,
BTest NVARCHAR(200)
)
INSERT INTO #a( ID, aTest)VALUES(1,'A')
INSERT INTO #a( ID, aTest)VALUES(2,'A')
INSERT INTO #b( ID, BTest)VALUES(1,'B')
SELECT * FROM #a LEFT JOIN #b ON #b.ID = #a.ID
--这样的效果,但这里要怎么做,如果#a表是1行的#b有两行的话,这样就只有一条数据了.
想解决不管哪个表有多少条数据.以最多的的一个表为准,另一个表不够用NULL补上.如果只有用左右的话,如何动态转换呢?
#8
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B')
SELECT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
刚才测了一下,用这个方法,可是如何取消重复呢?
#9
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
#10
按你这样还是不行
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
#11
什么提示?我的怎么可以。
#12
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(20)
)
CREATE TABLE #b
(
RiQi Date,
BTest NVARCHAR(20)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
SELECT DISTINCT * FROM #a LEFT JOIN #b ON #b.RiQi = #a.RiQi
B表有一条总复的数据
RiQi aTest RiQi BTest
---------- -------------------- ---------- --------------------
2013-06-11 A第二条 2013-06-11 B第一条
2013-06-11 A第一条 2013-06-11 B第一条
(2 行受影响)
#13
那我这边测试是正确的。我是SQL2000,不知道你是什么。要是别的版本我就不知道了。看你的数据类型我们的版本好像不一样。
2013-06-11 00:00:00.000 A 2013-06-11 00:00:00.000 B
(所影响的行数为 1 行)
2013-06-11 00:00:00.000 A 2013-06-11 00:00:00.000 B
(所影响的行数为 1 行)
#14
SELECT DISTINCT * FROM #a FULL OUTER JOIN #b ON #b.RiQi = #a.RiQi
全连接不就行了么
全连接不就行了么
#15
是一条也是不对的呀.A表有两条呀.你用一下12楼的测就知道了
#16
用这个也是一样的.
#17
以下可以达到你要的结果,但要满足一个假设条件: a,b 两表通过某一字段可以进行两表关联,而此字段在a,b两表中的数据中每行不能重复。
Select f.id, a.atest, b.btest
From (select id from tablea union select I'd from tableb) f left join tablea a on f.id =a.id
left join tableb b on f.id = b.id
Select f.id, a.atest, b.btest
From (select id from tablea union select I'd from tableb) f left join tablea a on f.id =a.id
left join tableb b on f.id = b.id
#18
A表,与B表没什么关联关系,就是把数据显示出来而已,同日的.
#19
那样的话,只能是根据日期和数据的自然输入顺序来连接两表了, 具体如下:
CREATE TABLE #a
(
RiQi date,
aTest NVARCHAR(200)
)
CREATE TABLE #b
(
RiQi Date,
bTest NVARCHAR(200)
)
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第一条')
INSERT INTO #a( RiQi, aTest)VALUES('2013-06-11','A第二条')
INSERT INTO #b( RiQi, BTest)VALUES('2013-06-11','B第一条')
Select f.RiQi, a.aTest, b.BTest
From (select RiQi, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY aTest) AS Row from #a UNION select RiQi, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY bTest) AS Row from #b ) f
LEFT JOIN (select RiQi, aTest, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY aTest) AS Row from #a) a ON f.riqi = a.riqi AND f.row = a.row
LEFT JOIN (select RiQi, bTest, ROW_NUMBER() OVER(PARTITION BY RiQi ORDER BY bTest) AS Row from #b) b ON f.riqi = b.riqi AND f.row = b.row
#20
我只是想说,我要改个头像....