数据库中一个表是多个图书馆的书记录,字段A为图书馆名,字段B为书名,怎么判断图书馆甲和乙有相同的书?

yyk7248 2017-09-14 03:37:32
数据库中的一个表是多个图书馆书的记录,字段A为图书馆名,字段B为书名,怎么判断图书馆甲和图书馆乙具有相同的书(书的数量和书名完全一样)?
...全文
695 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2017-09-15
  • 打赏
  • 举报
回复

slect B
from
(select distinct B FROM TABLE WHERE A='甲'
union all
select distinct B FROM TABLE WHERE A='乙') as a
group by B
having count(*)=1
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
在mysql中实测,如下方法通过: SELECT count(*) FROM (SELECT * from(SELECT * from (select 书名 as w from tt where 图书馆名='甲')a left join ( select 书名 as t from tt where 图书馆名='乙')b on a.w=b.t union SELECT * from (select 书名 as w from tt where 图书馆名='甲')c right join ( select 书名 as t from tt where 图书馆名='乙')d on c.w=d.t)mm WHERE w IS NULL OR t IS NULL)pp
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
引用 14 楼 zbdzjx 的回复:
试试这个:
with t1(序号, 图书馆名, 书名) as
(
select 1, '甲', '111' union all
select 2, '甲', '222' union all
select 3, '乙', '111' union all
select 4, '乙', '222'
)
select case when COUNT(*)=0 then '是' else '否' end from 
(select * from t1 where 图书馆名='甲') a
full join
(select * from t1 where 图书馆名='乙') b
on a.书名=b.书名
where a.序号 is null or b.序号 is null
感谢回答,谢谢!
二月十六 2017-09-14
  • 打赏
  • 举报
回复
mysql……如果是mysql上边的答案基本都不能用了,都是mssql的,试试这个,没测试。
SELECT    *
              FROM      ( SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    left JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '甲'
                                    AND t2.A = '乙'
                       union
SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    left JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '乙'
                                    AND t2.A = '甲'
                        ) t
              WHERE     t.t1A IS NULL
                        OR t.t2A IS NULL
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
试试这样:
IF ( EXISTS ( SELECT    *
              FROM      ( SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    FULL JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '甲'
                                    AND t2.A = '乙'
                        ) t
              WHERE     t.t1A IS NULL
                        OR t.t2A IS NULL ) )
    BEGIN
        PRINT '不完成相同'
    END
ELSE
    BEGIN
        PRINT '完成相同'
    END
明白您的意思了,这个方法是正确的,如果不用FULL JOIN 还有没有其它的办法呢, 我用mysql 没有FULL JOIN 啊。。。。
zbdzjx 2017-09-14
  • 打赏
  • 举报
回复
试试这个:
with t1(序号, 图书馆名, 书名) as
(
select 1, '甲', '111' union all
select 2, '甲', '222' union all
select 3, '乙', '111' union all
select 4, '乙', '222'
)
select case when COUNT(*)=0 then '是' else '否' end from 
(select * from t1 where 图书馆名='甲') a
full join
(select * from t1 where 图书馆名='乙') b
on a.书名=b.书名
where a.序号 is null or b.序号 is null
繁花尽流年 2017-09-14
  • 打赏
  • 举报
回复
引用 7 楼 zengertao 的回复:
[quote=引用 6 楼 yyk7248 的回复:] [quote=引用 1 楼 zengertao 的回复:] select * from ( select library,book,row_number() over(partition by book order by library) as rno from table ) a where rno>1 order by book,rno
不好意思,我没说明白,我是想判断比如,图书馆A有10本书,图书馆B有10本书,这10本书的名分别是一样的[/quote] 随便你几个图书馆几本书,这个都能告诉你,只要是不同图书馆有重名的[/quote]


select a.library,b.book from table a
inner join (
		select book from  table group by  book  having count(book)>1 
) b on a.nook=b.book
order by b.book,a.library
这样你能明白了没
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
表如下: 序号 图书馆名 书名 1 甲 111 2 甲 222 3 乙 111 4 乙 222 这样的结果就返回是 1 甲 111 2 乙 111 3 乙 222 这样的结果就返回否 1 甲 111 2 甲 222 3 乙 111 4 乙 333 这样的结果就返回否
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
表如下: 序号 图书馆名 书名 1 甲 111 2 甲 222 3 乙 111 4 乙 222 这样的结果就返回是 1 甲 111 2 乙 111 3 乙 222 这样的结果就返回否 1 甲 111 2 甲 222 3 乙 111 4 乙 333 这样的结果就返回否
引用 10 楼 acen_chen 的回复:
表结构先给清楚,数量是表中的一个字段还是每本书都有对应的编号,一本书一条记录
acen_chen 2017-09-14
  • 打赏
  • 举报
回复
表结构先给清楚,数量是表中的一个字段还是每本书都有对应的编号,一本书一条记录
二月十六 2017-09-14
  • 打赏
  • 举报
回复
引用 8 楼 yyk7248 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 试试这样:
IF ( EXISTS ( SELECT    *
              FROM      ( SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    FULL JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '甲'
                                    AND t2.A = '乙'
                        ) t
              WHERE     t.t1A IS NULL
                        OR t.t2A IS NULL ) )
    BEGIN
        PRINT '不完成相同'
    END
ELSE
    BEGIN
        PRINT '完成相同'
    END
谢谢您的回答,思路很好,不过,我的图书馆表是一个表,不是在两个表里面[/quote] 代码里没用两个表,是用的“表”然后不同的别名
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
试试这样:
IF ( EXISTS ( SELECT    *
              FROM      ( SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    FULL JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '甲'
                                    AND t2.A = '乙'
                        ) t
              WHERE     t.t1A IS NULL
                        OR t.t2A IS NULL ) )
    BEGIN
        PRINT '不完成相同'
    END
ELSE
    BEGIN
        PRINT '完成相同'
    END
谢谢您的回答,思路很好,不过,我的图书馆表是一个表,不是在两个表里面
繁花尽流年 2017-09-14
  • 打赏
  • 举报
回复
引用 6 楼 yyk7248 的回复:
[quote=引用 1 楼 zengertao 的回复:] select * from ( select library,book,row_number() over(partition by book order by library) as rno from table ) a where rno>1 order by book,rno
不好意思,我没说明白,我是想判断比如,图书馆A有10本书,图书馆B有10本书,这10本书的名分别是一样的[/quote] 随便你几个图书馆几本书,这个都能告诉你,只要是不同图书馆有重名的
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
引用 1 楼 zengertao 的回复:
select * from ( select library,book,row_number() over(partition by book order by library) as rno from table ) a where rno>1 order by book,rno
不好意思,我没说明白,我是想判断比如,图书馆A有10本书,图书馆B有10本书,这10本书的名分别是一样的
yyk7248 2017-09-14
  • 打赏
  • 举报
回复
引用 4 楼 zbdzjx 的回复:
噢,上个有错误,看这个。
select * from 
(select * from 书的记录 where A='图书馆甲') a,
(select * from 书的记录 where A='图书馆乙') b
where a.B=b.B and a.数量=b.数量
不好意思,我没说明白,我是想判断比如,图书馆A有10本书,图书馆B有10本书,这10本书的名分别是一样的
zbdzjx 2017-09-14
  • 打赏
  • 举报
回复
噢,上个有错误,看这个。
select * from 
(select * from 书的记录 where A='图书馆甲') a,
(select * from 书的记录 where A='图书馆乙') b
where a.B=b.B and a.数量=b.数量
zbdzjx 2017-09-14
  • 打赏
  • 举报
回复
select * from 
(select * from 书的记录 where A='图书馆甲') a,
(select * from 书的记录 where A='图书馆乙') b
where a.A=b.A and a.B=b.B and a.数量=b.数量
二月十六 2017-09-14
  • 打赏
  • 举报
回复
试试这样:
IF ( EXISTS ( SELECT    *
              FROM      ( SELECT    t1.A AS t1A ,
                                    t2.A AS t2A
                          FROM      表 t1
                                    FULL JOIN 表 t2 ON t1.B = t2.B
                          WHERE     t1.A = '甲'
                                    AND t2.A = '乙'
                        ) t
              WHERE     t.t1A IS NULL
                        OR t.t2A IS NULL ) )
    BEGIN
        PRINT '不完成相同'
    END
ELSE
    BEGIN
        PRINT '完成相同'
    END
繁花尽流年 2017-09-14
  • 打赏
  • 举报
回复
select * from ( select library,book,row_number() over(partition by book order by library) as rno from table ) a where rno>1 order by book,rno

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧