数据库中 根据 【组合分类】 查询 数据 怎么写SQL ???

ywspace 2013-05-28 12:16:03
分类表(Categroy)数据:
CID CName
-------------
1 A
2 B
3 C

主表(BankData)数据:

MID MName CID CODE
------------------------
1 M 1 1
2 M 2 1
3 H 1 2
4 H 3 2
5 K 1 3
6 K 2 3

现在 我想根据 分类 A + B 查询 主表数据 结果集为:

CODE MName
------------------
1 M
3 K

-------------------------------------------------------
哪位大牛 可以帮小弟 写下? 在线等 完事立马结贴把分送上!!!
...全文
223 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywspace 2013-05-29
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
if object_id('[Categroy]') is not null drop table [Categroy] 
go  
create table [Categroy]([CID] int,[CName] varchar(1)) 
insert [Categroy] 
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'
  
    
--> 测试数据:[BankData] 
if object_id('[BankData]') is not null drop table [BankData] 
go  
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int) 
insert [BankData] 
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3 union all
select 7,'K',4,3 union all
select 8,'K',5,3 union all
select 9,'F',1,4 union all
select 10,'F',4,4 union all
select 11,'S',1,5 union all
select 12,'S',5,5 union all
select 13,'X',1,6 
 
SELECT Mname,code
FROM (
SELECT  Mname,code,ROW_NUMBER()OVER(PARTITION BY code ORDER BY mid)id
FROM    [BankData] b 
INNER JOIN (
SELECT  [cid]
FROM    [Categroy]
WHERE   [cname] IN ( 'A', 'B' ) ) c ON b.cid=c.cid
)a
GROUP BY Mname,code
HAVING MAX(id)=(SELECT COUNT(1) FROM [Categroy]
WHERE   [cname] IN ( 'A', 'B' ) )

/*
Mname code
----- -----------
M     1
K     3
*/
你太牛了 ,这次对了 3Q! 结贴去
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
3、4两条数据为什么没有?规则是啥?
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
if object_id('[Categroy]') is not null drop table [Categroy] 
go  
create table [Categroy]([CID] int,[CName] varchar(1)) 
insert [Categroy] 
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'
  
    
--> 测试数据:[BankData] 
if object_id('[BankData]') is not null drop table [BankData] 
go  
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int) 
insert [BankData] 
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3 union all
select 7,'K',4,3 union all
select 8,'K',5,3 union all
select 9,'F',1,4 union all
select 10,'F',4,4 union all
select 11,'S',1,5 union all
select 12,'S',5,5 union all
select 13,'X',1,6 
 
SELECT Mname,code
FROM (
SELECT  Mname,code,ROW_NUMBER()OVER(PARTITION BY code ORDER BY mid)id
FROM    [BankData] b 
INNER JOIN (
SELECT  [cid]
FROM    [Categroy]
WHERE   [cname] IN ( 'A', 'B' ) ) c ON b.cid=c.cid
)a
GROUP BY Mname,code
HAVING MAX(id)=(SELECT COUNT(1) FROM [Categroy]
WHERE   [cname] IN ( 'A', 'B' ) )

/*
Mname code
----- -----------
M     1
K     3
*/
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
下班,回去再看
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
你是说比如3那个CODE,也包含了1、2,所以也应该查出来是吧?
不是,主表数据是这样的 一个MName 对应一个CODE 但可以对应 多个 CID . 现在想 通过 【组合分类】 CID (比如 分类 A 和 B) 来查询 主表信息。 以现有的 SQL 数据 查的理想结果为: MName CODE --------------- M 1 K 3
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
你是说比如3那个CODE,也包含了1、2,所以也应该查出来是吧?
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 14 楼 DBA_Huangzj 的回复:
你不给数据我测不出什么问题,我自己造的都不知道什么规律
---------------------------------------------------------------- 
-- Author  :DBA_Huangzj(發糞塗牆) 
-- Date    :2013-05-28 15:57:06 
-- Version: 
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)  
--    Jun 17 2011 00:54:03  
--    Copyright (c) Microsoft Corporation 
--    Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721) 
-- 
---------------------------------------------------------------- 
--> 测试数据:[Categroy] 
if object_id('[Categroy]') is not null drop table [Categroy] 
go  
create table [Categroy]([CID] int,[CName] varchar(1)) 
insert [Categroy] 
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'

  
--> 测试数据:[BankData] 
if object_id('[BankData]') is not null drop table [BankData] 
go  
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int) 
insert [BankData] 
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,4 union all
select 7,'K',4,5 union all
select 8,'K',5,6 union all
select 9,'F',6,4 union all
select 10,'F',5,6 
--------------开始查询-------------------------- 
SELECT DISTINCT [code],Mname 
FROM [BankData] 
WHERE [code] NOT IN ( 
SELECT  code 
FROM    [BankData] b 
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid] 
                       FROM     [Categroy] 
                       WHERE    [cname] IN ( 'A', 'B','D' ) ) ) 
ORDER BY code 
  
  
----------------结果---------------------------- 
/*  
code        Mname
----------- -----
1           M
3           K
5           K
*/

if object_id('[Categroy]') is not null drop table [Categroy] 
go  
create table [Categroy]([CID] int,[CName] varchar(1)) 
insert [Categroy] 
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'
 
   
--> 测试数据:[BankData] 
if object_id('[BankData]') is not null drop table [BankData] 
go  
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int) 
insert [BankData] 
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3 union all
select 7,'K',4,3 union all
select 8,'K',5,3 union all
select 9,'F',1,4 union all
select 10,'F',4,4 union all
select 11,'S',1,5 union all
select 12,'S',5,5 union all
select 13,'X',1,6 


SELECT DISTINCT [code],Mname 
FROM [BankData] 
WHERE [code] NOT IN ( 
SELECT  code 
FROM    [BankData] b 
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid] 
                       FROM     [Categroy] 
                       WHERE    [cname] IN ( 'A','B') ) ) 
ORDER BY code 
看下 这个数据 就是有问题的, 满足 组合条件的数据 只有 M 和 K。
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
你不给数据我测不出什么问题,我自己造的都不知道什么规律
---------------------------------------------------------------- 
-- Author  :DBA_Huangzj(發糞塗牆) 
-- Date    :2013-05-28 15:57:06 
-- Version: 
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)  
--    Jun 17 2011 00:54:03  
--    Copyright (c) Microsoft Corporation 
--    Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721) 
-- 
---------------------------------------------------------------- 
--> 测试数据:[Categroy] 
if object_id('[Categroy]') is not null drop table [Categroy] 
go  
create table [Categroy]([CID] int,[CName] varchar(1)) 
insert [Categroy] 
select 1,'A' union all
select 2,'B' union all
select 3,'C' union all
select 4,'D' union all
select 5,'E' union all
select 6,'F'

  
--> 测试数据:[BankData] 
if object_id('[BankData]') is not null drop table [BankData] 
go  
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int) 
insert [BankData] 
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,4 union all
select 7,'K',4,5 union all
select 8,'K',5,6 union all
select 9,'F',6,4 union all
select 10,'F',5,6 
--------------开始查询-------------------------- 
SELECT DISTINCT [code],Mname 
FROM [BankData] 
WHERE [code] NOT IN ( 
SELECT  code 
FROM    [BankData] b 
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid] 
                       FROM     [Categroy] 
                       WHERE    [cname] IN ( 'A', 'B','D' ) ) ) 
ORDER BY code 
  
  
----------------结果---------------------------- 
/*  
code        Mname
----------- -----
1           M
3           K
5           K
*/
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 12 楼 DBA_Huangzj 的回复:
那把你觉得有不准的那些数据列出来看看,我觉得我的思路没问题啊
你把主表 和 分类表 多添加几条数据 就会有不准的情况了
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
那把你觉得有不准的那些数据列出来看看,我觉得我的思路没问题啊
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
[quote=引用 8 楼 ywspace 的回复:] [quote=引用 5 楼 DBA_Huangzj 的回复:]
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-28 15:57:06
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--	Jun 17 2011 00:54:03 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------------------------------------------
--> 测试数据:[Categroy]
if object_id('[Categroy]') is not null drop table [Categroy]
go 
create table [Categroy]([CID] int,[CName] varchar(1))
insert [Categroy]
select 1,'A' union all
select 2,'B' union all
select 3,'C'

--> 测试数据:[BankData]
if object_id('[BankData]') is not null drop table [BankData]
go 
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int)
insert [BankData]
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3
--------------开始查询--------------------------
SELECT DISTINCT [code],Mname
FROM [BankData]
WHERE [code] NOT IN (
SELECT  code
FROM    [BankData] b
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid]
                       FROM     [Categroy]
                       WHERE    [cname] IN ( 'A', 'B' ) ) )
ORDER BY code


----------------结果----------------------------
/* 
code        Mname
----------- -----
1           M
3           K
*/
好像有问题, 当分类和主表数据 比较多的时候 数据查询出来就不准了! 老大 帮忙在看看。 [/quote]能多给点数据吗?数据太少可能看不出规律[/quote] 我这边也是临时手工弄的数据也不多。 这个和股票的很像。 一支股票 可以从属多个板块。 现在想 多个板块组合 查询 股票。 查出来的股票从属每一个条件板块。
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
引用 8 楼 ywspace 的回复:
[quote=引用 5 楼 DBA_Huangzj 的回复:]
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-28 15:57:06
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--	Jun 17 2011 00:54:03 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------------------------------------------
--> 测试数据:[Categroy]
if object_id('[Categroy]') is not null drop table [Categroy]
go 
create table [Categroy]([CID] int,[CName] varchar(1))
insert [Categroy]
select 1,'A' union all
select 2,'B' union all
select 3,'C'

--> 测试数据:[BankData]
if object_id('[BankData]') is not null drop table [BankData]
go 
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int)
insert [BankData]
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3
--------------开始查询--------------------------
SELECT DISTINCT [code],Mname
FROM [BankData]
WHERE [code] NOT IN (
SELECT  code
FROM    [BankData] b
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid]
                       FROM     [Categroy]
                       WHERE    [cname] IN ( 'A', 'B' ) ) )
ORDER BY code


----------------结果----------------------------
/* 
code        Mname
----------- -----
1           M
3           K
*/
好像有问题, 当分类和主表数据 比较多的时候 数据查询出来就不准了! 老大 帮忙在看看。 [/quote]能多给点数据吗?数据太少可能看不出规律
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 7 楼 tangguangqiang 的回复:
[quote=引用 4 楼 ywspace 的回复:] [quote=引用 2 楼 tangguangqiang 的回复:] 猜一个。

select code,mname from bankdata b where exists(select 1 from bankdata where code=b.code and
cid>b.cid) and b.code in(1,3)
多谢了哥们 你猜的不对啊! [/quote] 不好意思 exists前面少写了个not.[/quote] 查不到数据啊,多谢百忙中来回帖 帮忙再看下。
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-28 15:57:06
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--	Jun 17 2011 00:54:03 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------------------------------------------
--> 测试数据:[Categroy]
if object_id('[Categroy]') is not null drop table [Categroy]
go 
create table [Categroy]([CID] int,[CName] varchar(1))
insert [Categroy]
select 1,'A' union all
select 2,'B' union all
select 3,'C'

--> 测试数据:[BankData]
if object_id('[BankData]') is not null drop table [BankData]
go 
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int)
insert [BankData]
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3
--------------开始查询--------------------------
SELECT DISTINCT [code],Mname
FROM [BankData]
WHERE [code] NOT IN (
SELECT  code
FROM    [BankData] b
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid]
                       FROM     [Categroy]
                       WHERE    [cname] IN ( 'A', 'B' ) ) )
ORDER BY code


----------------结果----------------------------
/* 
code        Mname
----------- -----
1           M
3           K
*/
好像有问题, 当分类和主表数据 比较多的时候 数据查询出来就不准了! 老大 帮忙在看看。
习惯性蹭分 2013-05-28
  • 打赏
  • 举报
回复
引用 4 楼 ywspace 的回复:
[quote=引用 2 楼 tangguangqiang 的回复:] 猜一个。

select code,mname from bankdata b where exists(select 1 from bankdata where code=b.code and
cid>b.cid) and b.code in(1,3)
多谢了哥们 你猜的不对啊! [/quote] 不好意思 exists前面少写了个not.
习惯性蹭分 2013-05-28
  • 打赏
  • 举报
回复

select code,mname from(
select code,mname,
cid=(select ','+cast(cid as varchar)  from bankdata where code=b.code for xml path(',')) from bankdata b
group by code,mname) as c
where cid=',1,2'
没测试不知道行不行。
發糞塗牆 2013-05-28
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-28 15:57:06
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--	Jun 17 2011 00:54:03 
--	Copyright (c) Microsoft Corporation
--	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------------------------------------------
--> 测试数据:[Categroy]
if object_id('[Categroy]') is not null drop table [Categroy]
go 
create table [Categroy]([CID] int,[CName] varchar(1))
insert [Categroy]
select 1,'A' union all
select 2,'B' union all
select 3,'C'

--> 测试数据:[BankData]
if object_id('[BankData]') is not null drop table [BankData]
go 
create table [BankData]([MID] int,[MName] varchar(1),[CID] int,[CODE] int)
insert [BankData]
select 1,'M',1,1 union all
select 2,'M',2,1 union all
select 3,'H',1,2 union all
select 4,'H',3,2 union all
select 5,'K',1,3 union all
select 6,'K',2,3
--------------开始查询--------------------------
SELECT DISTINCT [code],Mname
FROM [BankData]
WHERE [code] NOT IN (
SELECT  code
FROM    [BankData] b
WHERE   [cid] NOT IN ( SELECT DISTINCT
                                [cid]
                       FROM     [Categroy]
                       WHERE    [cname] IN ( 'A', 'B' ) ) )
ORDER BY code


----------------结果----------------------------
/* 
code        Mname
----------- -----
1           M
3           K
*/
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 2 楼 tangguangqiang 的回复:
猜一个。

select code,mname from bankdata b where exists(select 1 from bankdata where code=b.code and
cid>b.cid) and b.code in(1,3)
多谢了哥们 你猜的不对啊!
ywspace 2013-05-28
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
3、4两条数据为什么没有?规则是啥?
组合分类查询的, 数据 M 和 K 都包含了 分类 A 和 B . 数据 H 有的分类为 A 和 C ,所以 就没有 3,4条的数据了 。 希望给解决下 谢了先!
习惯性蹭分 2013-05-28
  • 打赏
  • 举报
回复
猜一个。

select code,mname from bankdata b where exists(select 1 from bankdata where code=b.code and
cid>b.cid) and b.code in(1,3)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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