求 大家帮忙写个SQL

sdlwhgw 2013-05-21 02:55:07
有2个表

CREATE TABLE T1 --表1
(
SNO INT ,
SLineNO INT,
Qty INT,
ASNO INT,
ASLineNO INT
);
INSERT INTO T1 VALUES
(1001, 1, 10, 1009, 1),
(1001, 2, 10, 1009, 2),
(1002, 1, 10, 1009, 1),
(1003, 1, 10, 2009, 1),
(1003, 2, 10, 2009, 2),
(1004, 1, 10, 2009, 2),
(1005, 1, 10, 3009, 1),
(1005, 2, 10, 4009, 1);

CREATE TABLE T2--表2
( ASNO INT,
ASLineNO INT,
AQty INT,
);

INSERT INTO T2 VALUES
(1009, 1, 10),
(1009, 2, 10),
(2009, 1, 10000),
(2009, 2, 20),
(3009, 1, 10),
(5009, 1, 30),
(6009, 1, 10);

介绍; 表1 的主键是 SNO,SlineNO, 表2 的主键是 ASNO, ASLineNO
表2 中的一行,可以对应表1中的多行,其中表2中的AQTY 是该行对应的表1中行的合计
表1的一个SNO下不同的行,可能对应 表2 的不同的ANO的不同的行
要求抽出的结果
					
SNO SLineNO Qty ASNO ASLineNO
1001 1 10 1009 1
1001 2 10 1009 2
1002 1 10 6009 1


可以这么理解 表2 的一个ASNO 对应表1的 复数个SNO,表2 的SNO有很多行,可以对应表1 的更多的行 ,以此类推,但是绝对不会出现无限的循环。

抽出的结果就是 表1,表2 都存在而且 数量恰好都一致的数据。
...全文
114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MrYangkang 2013-05-21
  • 打赏
  • 举报
回复

--这样也可以哦
select T1.* from T1,T2,(select * from T1 WHERE ASNO NOT IN (SELECT ASNO FROM T2))T3
where T1.ASNO = T2.ASNO AND 
T1.ASLineNO = T2.ASLineNO AND
T1.Qty = T2.AQty AND T1.SNO <> T3.SNO
發糞塗牆 2013-05-21
  • 打赏
  • 举报
回复
--CREATE TABLE T1  --表1 
-- (  
--    SNO INT ,  
--    SLineNO INT, 
--    Qty INT, 
--    ASNO INT, 
--    ASLineNO INT
--);  
--INSERT INTO T1 VALUES
--(1001,    1,    10,    1009,    1), 
--(1001,    2,    10,    1009,    2), 
--(1002,    1,    10,    1009,    1), 
--(1003,    1,    10,    2009,    1), 
--(1003,    2,    10,    2009,    2), 
--(1004,    1,    10,    2009,    2), 
--(1005,    1,    10,    3009,    1), 
--(1005,    2,    10,    4009,    1); 
  
--CREATE TABLE T2--表2 
-- (  ASNO INT, 
--    ASLineNO INT, 
--    AQty INT, 
--);  
  
--INSERT INTO T2 VALUES
--(1009,  1,    10), 
--(1009,    2,    10), 
--(2009,    1,    10000), 
--(2009,    2,    20), 
--(3009,    1,    10), 
--(5009,    1,    30), 
--(6009,    1,    10);
SELECT *
FROM 
(SELECT SNO,SLINENO,SUM(QTY)QTY,ASNO,ASLINENO FROM t1 
WHERE sno NOT  IN (SELECT sno FROM t1 WHERE asno NOT  IN(SELECT asno FROM t2))
GROUP BY SNO,SLINENO,ASNO,ASLINENO)A 
INNER JOIN T2 B ON A.ASNO=B.ASNO AND A.SLINENO=B.ASLINENO
WHERE A.QTY=B.AQTY 



/*
SNO         SLINENO     QTY         ASNO        ASLINENO    ASNO        ASLineNO    AQty
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1001        1           10          1009        1           1009        1           10
1002        1           10          1009        1           1009        1           10
1001        2           10          1009        2           1009        2           10
*/
sdlwhgw 2013-05-21
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
好像1005也符合吧
SELECT *
FROM 
(SELECT SNO,SLINENO,SUM(QTY)QTY,ASNO,ASLINENO FROM t1 
GROUP BY SNO,SLINENO,ASNO,ASLINENO)A 
INNER JOIN T2 B ON A.ASNO=B.ASNO AND A.SLINENO=B.ASLINENO
WHERE A.QTY=B.AQTY 
/*
SNO         SLINENO     QTY         ASNO        ASLINENO    ASNO        ASLineNO    AQty
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1001        1           10          1009        1           1009        1           10
1001        2           10          1009        2           1009        2           10
1002        1           10          1009        1           1009        1           10
1005        1           10          3009        1           3009        1           10
*/
这个结果是不对的,因为1005 这个SNO 有两行数据, 第二行数据对应的 ASNO是4009 的数据在T2里实际是不存在的 所以 1005这个不能作为结果显示出来。
發糞塗牆 2013-05-21
  • 打赏
  • 举报
回复
好像1005也符合吧
SELECT *
FROM 
(SELECT SNO,SLINENO,SUM(QTY)QTY,ASNO,ASLINENO FROM t1 
GROUP BY SNO,SLINENO,ASNO,ASLINENO)A 
INNER JOIN T2 B ON A.ASNO=B.ASNO AND A.SLINENO=B.ASLINENO
WHERE A.QTY=B.AQTY 
/*
SNO         SLINENO     QTY         ASNO        ASLINENO    ASNO        ASLineNO    AQty
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1001        1           10          1009        1           1009        1           10
1001        2           10          1009        2           1009        2           10
1002        1           10          1009        1           1009        1           10
1005        1           10          3009        1           3009        1           10
*/
sdlwhgw 2013-05-21
  • 打赏
  • 举报
回复
最笨的方法 用循环,一条一条判断的话 应该可以

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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