日期:2014-05-17  浏览次数:20438 次

求 大家帮忙写个SQL
有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 都存在而且 数量恰好都一致的数据。

------解决方案--------------------
好像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