首页 新闻 搜索 专区 学院

寻求一sql解决方案

1
悬赏园豆:60 [已解决问题] 解决于 2014-03-10 16:30

如:

订单主表

orderid    name2  

001         玩儿     

002         玩儿2     

003         玩儿3       

订单子表 

id    orderid   name

1      001          a

2      002          a

3      001          c

4      002          b

5      002          d

6       003          a

7        003         c

根据 name=a  并且 name=c  查询 主表  

结果是 001  003 的

orderid    name2  

001         玩儿     

003         玩儿3  

60
.L的主页 .L | 初学一级 | 园豆:5
提问于:2013-09-23 10:15
< >
分享
最佳答案
0

是子查主的问题,通过子表中name=a且name=c的订单 通过orderid关联查询订单主表,我的SQL语句如下

select g.orderid,g.name2 from (select e.orderid from (select a.id,a.[name],a.orderid from #t2 as a  where a.name='a') as d inner join  (select a.id,a.[name],a.orderid from #t2 as a  where a.name='c') as e on e.orderid=d.orderid) as f left join #t1 as g on g.orderid=f.orderid

收获园豆:25
火精灵 | 菜鸟二级 |园豆:227 | 2013-09-29 11:36
其他回答(5)
0

name=a  并且 name=c 能查出数据?

收获园豆:5
guwoow | 园豆:611 (小虾三级) | 2013-09-23 10:20

楼主说出了,应该是“或”吧

支持(0) 反对(0) 会长 | 园豆:9682 (大侠五级) | 2013-09-23 10:22

@会长: 是“或”从子订单里查的结果也是 orderid 等于 001,002,003 的都出来了

支持(0) 反对(0) guwoow | 园豆:611 (小虾三级) | 2013-09-23 10:25

@guwoow: 明白你意思了,你说是只有同时包含a和c的才查出来?

支持(0) 反对(0) 会长 | 园豆:9682 (大侠五级) | 2013-09-23 10:28

@guwoow: 是或的话  002 也能查出来啦  

支持(0) 反对(0) .L | 园豆:5 (初学一级) | 2013-09-23 10:30

@会长: 嗯 对的  子查主 

支持(0) 反对(0) .L | 园豆:5 (初学一级) | 2013-09-23 10:30
0

select  a.* from 订单主表

where

orderid   in ( select distinct orderid  from 订单子表 b where b.name = 'a' or name = 'c')

收获园豆:5
wanglgkaka | 园豆:218 (菜鸟二级) | 2013-09-23 10:37

No, 你这种 002 也能查的出来  错误 

支持(0) 反对(0) .L | 园豆:5 (初学一级) | 2013-09-23 10:43

@llhhll004: 

刚才看错题目了

 

select  distinct a.* from 订单主表 a

inner join  订单子表 b  on b.name = 'a'  and  a.orderid = b.orderid  inner join  订单子表 c  on c.name = 'c'  and  a.orderid = c.orderid

支持(0) 反对(0) wanglgkaka | 园豆:218 (菜鸟二级) | 2013-09-23 10:57

@wanglgkaka: 见我这种 

select * from 主表 where 

exists (select * from   子表  as a where a.orderid    =主表.orderid    and a.name='a')
and exists (select * from 子表 as a where a.orderid    =主表.orderid  and a.name='c')

 

这样查出来的就是 001 , 003的数据

支持(0) 反对(0) .L | 园豆:5 (初学一级) | 2013-09-23 11:01
0
select t_p.* from t_p
join 
(
    select * from 
    (
        select count(*) as rowCount, t.orderid from
        (
            select distinct orderid ,name from t_c
            where name = 'c' or name = 'a' 
        )t
        group by t.orderid
    )tt
    where tt.rowCount > 1
)ttt on t_p.orderid = ttt.orderid

如果属于同一个主表的字表Name字段值没有重复的,也可以不用distinct

收获园豆:10
会长 | 园豆:9682 (大侠五级) | 2013-09-23 10:48

不知 你是不是对的 

我的

select * from 主表 where 

exists (select * from   子表  as a where a.orderid    =主表.orderid    and a.name='a')
and exists (select * from 子表 as a where a.orderid    =主表.orderid  and a.name='c')

 

这样查出来的就是 001 , 003的数据

支持(0) 反对(0) .L | 园豆:5 (初学一级) | 2013-09-23 10:59

@llhhll004: 都行,看看哪个效率高。我对sql也没研究,可以测试一下哪个速度快

支持(0) 反对(0) 会长 | 园豆:9682 (大侠五级) | 2013-09-23 11:07
1
SELECT t1.OrderId,t3.Name2
FROM   #T2 t1
       JOIN #T2 t2
            ON  t2.OrderId = t1.orderId
       LEFT JOIN #T1 t3
            ON  t3.OrderId = t1.OrderId
WHERE  t1.NAME = 'c' AND t2.NAME = 'a'
收获园豆:10
幻天芒 | 园豆:36662 (高人七级) | 2013-09-23 11:31

测试语句:

CREATE TABLE #T1
(
    OrderId  VARCHAR(50),
    Name2    VARCHAR(50)
)
INSERT INTO #T1
SELECT '001',
       '玩儿'
UNION
SELECT '002',
       '玩儿2'
UNION
SELECT '003',
       '玩儿3'

CREATE TABLE #T2
(
    Id       INT,
    OrderId  VARCHAR(50),
    NAME     VARCHAR(50)
)
INSERT INTO #T2
SELECT 1,
       '001',
       'a' 
UNION
SELECT 2,
       '002',
       'a' 
UNION
SELECT 3,
       '001',
       'c' 
UNION
SELECT 4,
       '002',
       'b' 
UNION
SELECT 5,
       '002',
       'd' 
UNION
SELECT 6,
       '003',
       'a' 
UNION
SELECT 7,
       '003',
       'c'


SELECT t1.OrderId,
       t3.Name2
FROM   #T2 t1
       JOIN #T2 t2
            ON  t2.OrderId = t1.orderId
       LEFT JOIN #T1 t3
            ON  t3.OrderId = t1.OrderId
WHERE  t1.NAME = 'c'
       AND t2.NAME = 'a'

 

支持(2) 反对(0) 幻天芒 | 园豆:36662 (高人七级) | 2013-09-23 11:32

很久没看博问了,看见你写的特意登录说一下:

SELECT t3.OrderId,
       t3.Name2
FROM   #T2 t1
       JOIN #T2 t2
            ON  t2.OrderId = t1.orderId and t1.Name < t2.Name
       LEFT JOIN #T1 t3
            ON  t3.OrderId = t1.OrderId
WHERE  t1.NAME = 'a'
       AND t2.NAME = 'c'

不过你的答案很好,不过我觉的这样是不会性能好点呢?

 

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2013-09-28 23:04

@小小刀: 谢谢指教,我看了下执行计划,从这上面看起来性能是差不多的。

我对其中的t1.Name<t2.Name不是很理解呢~

支持(0) 反对(0) 幻天芒 | 园豆:36662 (高人七级) | 2013-09-28 23:36
0

问题描述有问题,没猜错的话,目的是查询同时包含name=a和c的订单,1楼是正解

收获园豆:5
finding_job-sunt | 园豆:204 (菜鸟二级) | 2013-09-27 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册