sql server7结果集的比较

raymen 2001-11-28 09:43:12
大家好,请问一个SQL语句怎么写
有两个表A,B,分别为主从表,我想要判断A表中某两行的子集(即B表中对应的记录)是否相同,请问该怎么写呢?
A表的结构为product_no
B表的结构为product_no , part_no , qty其中product_no和part_no为字符,qty为decimel型
我想判断是否有在同一个product_no的情况下part_no , qty完全相同的。
如B表中
product_no , part_no , qty
100 1001 10
100 1002 5
200 1001 10
200 1002 5
300 1001 10
300 1002 5
300 1003 10
400 1001 5
400 1002 5
在这个情况下100的子集等于200的子集,但不等于300和400的子集,请问这样能否用SQL语句判断?分不够的话我可以多开几个来加,请高手帮个忙,谢谢!
...全文
386 24 打赏 收藏 举报
写回复
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
trouble 2001-12-02
  • 打赏
  • 举报
回复
学习
nononono 2001-11-28
  • 打赏
  • 举报
回复
上面条件写反了.

SELECT DISTINCT a.product_no
FROM TableA as a
WHERE NOT EXISTS
(SELECT *
FROM TableB AS b
FULL OUTER JOIN
TableC AS c
ON b.product_no=a.product_no AND b.part_no=c.part_no AND b.qty=c.qty
WHERE b.part_no IS NULL OR b.qty IS NULL OR
c.part_no IS NULL OR c.qty IS NULL)

或许如下的连接更合理:

SELECT DISTINCT a.product_no
FROM TableA as a
WHERE NOT EXISTS
(SELECT *
FROM TableB AS b
FULL OUTER JOIN
TableC AS c
ON b.part_no=c.part_no AND b.qty=c.qty
WHERE b.product_no=a.product_no AND
(b.part_no IS NULL OR b.qty IS NULL OR
c.part_no IS NULL OR c.qty IS NULL)
)




raymen 2001-11-28
  • 打赏
  • 举报
回复
各位大哥帮帮忙吧:(
nononono 2001-11-28
  • 打赏
  • 举报
回复
A. 列出表B与表C中重复的product_no

SELECT DISTINCT a.product_no
FROM TableA as a
WHERE EXISTS
(SELECT *
FROM TableB AS b
FULL OUTER JOIN
TableC AS c
ON b.product_no=a.product_no AND b.part_no=c.part_no AND b.qty=c.qty
WHERE b.part_no IS NULL OR b.qty IS NULL OR
c.part_no IS NULL OR c.qty IS NULL)
raymen 2001-11-28
  • 打赏
  • 举报
回复
to:rwq_(风云浪子),问题不在于COUNT啊,个数相同但组合不同有什么意义呢
raymen 2001-11-28
  • 打赏
  • 举报
回复
是BOM的一种啦,比较复杂的。如果我先判断C表跟B表是否重复再INSERT的话,就能保证B表中永远也不会出现重复,所以也就不存在第二个问题了。
nononono 2001-11-28
  • 打赏
  • 举报
回复
是BOM吧?

你是不是在增加新的记录前就需要判断表C与表B中是否重复, 并不是要判断表B内已经有重复? 这可是2个问题.
rwq_ 2001-11-28
  • 打赏
  • 举报
回复
能不能用一些怪方法:(我想找和part_no=100的结果集)
select product_no from b where
(select count(*) from b b1,b b2
where b1.part_no=b2.part_no and b1.qty=b2.qty and b1.product_no=100 and b2.product_no=b.product_no)
=(select count(*) from b b2 where b2.product_no=b.product_no)

看看吧,不知还有什么缺点!
raymen 2001-11-28
  • 打赏
  • 举报
回复
例如说我建另外一个表C,结构为part_no , qty,那么在应用中我先在C表增加几条记录,做一个组合,如:
part_no qty
1001 10
1002 5
然后判断b表中,是否存在这样的组合,如果不存在,就把这个组合加上一个product_no,然后insert到b表中。然后清空c表
这样说清楚了吧?
nononono 2001-11-28
  • 打赏
  • 举报
回复
raymen 2001-11-28
  • 打赏
  • 举报
回复
好,先说怎么判断结果集是否重复啊,不要求返回重复的product_no,只要知道重复了就行。
nononono 2001-11-28
  • 打赏
  • 举报
回复
你这样说就有些乱了, 问题一个一个地来. 先说一个:

如果有重复, 则重复的PRODUCT_NO至少有2个, 你怎么说"那个"?

到底要什么样的结果? 说一种, 先别说别的,
raymen 2001-11-28
  • 打赏
  • 举报
回复
哈哈,我要的结果是不允许他重复。在新增的时候,如果已经存在一样的组合,则找到那个已经存在的组合的PRODUCT_NO.
另外,可以的话还想得到这样的结果,如:
product_no , part_no , qty
100 1001 10
100 1002 5
200 1001 10
200 1002 5
300 1001 10
300 1002 5
300 1003 10
400 1001 5
400 1002 5
还想得到其中不考虑qty,只考虑part_no的情况判断有哪几个是由相同的part_no组成的,结果可以用数组或其他方式也可以.
jasmine 2001-11-28
  • 打赏
  • 举报
回复
好像很麻烦的样子
这样try一下:暂时没想到好办法
declare @A varchar(255),@B varchar(255)
set @A = '100' ,@B = '200'
if ( (select count(*) from B where product_no = @A) = (select count(*) from B where product_no = @B) ) and
( (select count(*) from B where product_no = @A) = (select count(*) from B B1 ,B B2 where B1.product_no = @A and B1.product_no = @B and B1.part_no = B2.part_no and B1.qty = B2.qty) )
print true
else
print false
方法好苯哦
nononono 2001-11-28
  • 打赏
  • 举报
回复
考虑一下这个问题的结果的形式.
假如:
100与200、300重复,400与500重复。

A. 只用一列给出重复的product_no并不好:
100
200
300
400
500

B. 用两列给出重复的product_no也不很好:
100 200
200 300
300 100
400 500

你需要什么样的结果?
raymen 2001-11-28
  • 打赏
  • 举报
回复
在这个问题中当然可以不用它,但在应用中有别的用途,
对了,另外请问这个SQL语句有什么好的书呢
辛苦各为高手了:)
nononono 2001-11-28
  • 打赏
  • 举报
回复
你的问题中, 表A可以不要.
nononono 2001-11-28
  • 打赏
  • 举报
回复
很多人都在想呐, 想啊想啊, 想的头破血流. 呵呵
raymen 2001-11-28
  • 打赏
  • 举报
回复
既然是好题,就请大家帮俺想想好吗?
nononono 2001-11-28
  • 打赏
  • 举报
回复
好题.
加载更多回复(4)
发帖
MS-SQL Server

3.4w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
帖子事件
创建了帖子
2001-11-28 09:43
社区公告
暂无公告