一条SQL语句

xiaowangtian1117 2009-08-25 04:44:57
表数据:
NAME TYPE NUM
A 在线 1
B 修复 2
A 修复 3
B 在线 4
D 在线 5
D 修复 6
F 修复 7
C 在线 8
C 在线 9
E 在线 10
E 修复 11
E 修复 12
F 修复 13
想得到TYPE只有‘在线’的类型的NAME行
例如:NAME中只有C数据的TYPE只是“在线” 所以取到以下两条数据:
C 在线 8
C 在线 9
...全文
186 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
idealy 2009-08-27
  • 打赏
  • 举报
回复
不想要一个查询中套一个查询

我想应该是报表中用此查询,但不支持 嵌套语法。


那可以变向的写个视图啊。

就可以不嵌套了。
xxmsuper 2009-08-26
  • 打赏
  • 举报
回复

declare @t table(name char(1),type nvarchar(5),num int)
insert @t
select 'A','在线',1 union all
select 'B','修复',2 union all
select 'A','修复',3 union all
select 'B','在线',4 union all
select 'D','在线',5 union all
select 'D','修复',6 union all
select 'F','修复',7 union all
select 'C','在线',8 union all
select 'C','在线',9 union all
select 'E','在线',10 union all
select 'E','修复',11 union all
select 'E','修复',12 union all
select 'F','修复',13

select * from @t A
where not exists(select * from @t where name=A.name and type<>'在线')

name type num
---- ----- -----------
C 在线 8
C 在线 9

(2 行受影响)

SQL77 2009-08-26
  • 打赏
  • 举报
回复
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( NAME varchar(10), TYPE varchar(10) , NUM int )
go
insert tb SELECT
'A' , '在线', 1 UNION ALL SELECT
'B' ,'修复' , 2 UNION ALL SELECT
'A' , '修复' , 3 UNION ALL SELECT
'B' ,'在线' , 4 UNION ALL SELECT
'D' , '在线' , 5 UNION ALL SELECT
'D' , '修复' , 6 UNION ALL SELECT
'F' ,'修复' , 7 UNION ALL SELECT
'C' , '在线' , 8 UNION ALL SELECT
'C' , '在线' , 9 UNION ALL SELECT
'E' , '在线' , 10 UNION ALL SELECT
'E' , '修复' , 11 UNION ALL SELECT
'E' , '修复' , 12
go


SELECT * FROM TB WHERE TYPE='在线'
AND NAME NOT IN
(SELECT NAME FROM TB WHERE TYPE<>'在线')

NAME TYPE NUM
---------- ---------- -----------
C 在线 8
C 在线 9

(所影响的行数为 2 行)
  • 打赏
  • 举报
回复
学习了
xiaowangtian1117 2009-08-26
  • 打赏
  • 举报
回复
不想要一个查询中套一个查询
lihan6415151528 2009-08-26
  • 打赏
  • 举报
回复

SELECT * FROM tb AS A WHERE NOT EXISTS(SELECT * FROM tb WHERE A.name = name AND type <> '在线')
张家可 2009-08-26
  • 打赏
  • 举报
回复




declare @t table(name char(1),type nvarchar(5),num int)
insert @t
select 'A','在线',1 union all
select 'B','修复',2 union all
select 'A','修复',3 union all
select 'B','在线',4 union all
select 'D','在线',5 union all
select 'D','修复',6 union all
select 'F','修复',7 union all
select 'C','在线',8 union all
select 'C','在线',9 union all
select 'E','在线',10 union all
select 'E','修复',11 union all
select 'E','修复',12 union all
select 'F','修复',13
------------------------
select * from @t A
where name not in (select name from @t where type<>'在线')
--------------------

(所影响的行数为 13 行)

name type num
---- ----- -----------
C 在线 8
C 在线 9

(所影响的行数为 2 行)

ChinaITOldMan 2009-08-26
  • 打赏
  • 举报
回复
select *
from tb a
where not exists(select * from tb where a.name=name and [type]<>'在线')
victorcai2006 2009-08-26
  • 打赏
  • 举报
回复

-------------------------------
--瘦狼阿亮 | 钱不是问题,问题是没钱
-------------------------------

--建立测试环境表
declare @tmptb table
(NAME varchar(10),TYPE varchar(10),NUM smallint)

--建立测试数据
insert into @tmptb
select 'A','在线',1 union all
select 'B','修复',2 union all
select 'A','修复',3 union all
select 'B','在线',4 union all
select 'D','在线',5 union all
select 'D','修复',6 union all
select 'F','修复',7 union all
select 'C','在线',8 union all
select 'C','在线',9 union all
select 'E','在线',10 union all
select 'E','修复',11 union all
select 'E','修复',12 union all
select 'F','修复',13

/*
(13 行受影响)
*/

--查看测试数据
select * from @tmptb

/*
NAME TYPE NUM
---------- ---------- ------
A 在线 1
B 修复 2
A 修复 3
B 在线 4
D 在线 5
D 修复 6
F 修复 7
C 在线 8
C 在线 9
E 在线 10
E 修复 11
E 修复 12
F 修复 13

(13 行受影响)
*/

select name,type,num from @tmptb a
where not exists(select 1 from @tmptb where a.name=name and type<>'在线')

/*
name type num
---------- ---------- ------
C 在线 8
C 在线 9

(2 行受影响)
*/


测试过了,应该问题不大了,楼主针对这个问题关键主要就是交集和差集
楼主好好看看联机丛书里面的EXISTS和NOT EXISTS方面内容,
掌握关键后,问题就不是问题了
victorcai2006 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feixianxxx 的回复:]
SQL codeselect*from tb awherenotexists(select*from tbwhere a.name=nameand[type]<>'在线')
[/Quote]
就是这样的就可以了
xingjunli 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liangck 的回复:]
SQL codeSELECT*FROM tbAS AWHERENOTEXISTS(SELECT*FROM tbWHERE A.name= nameAND type<>'在线')
[/Quote]
这样就OK吧
feixianxxx 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaowangtian1117 的回复:]
不好意思!
请不要用嵌入查询,用一条SQL语句实现
[/Quote]
。。。这个本来就是一条。。。
xiaowangtian1117 2009-08-25
  • 打赏
  • 举报
回复
不好意思!
请不要用嵌入查询,用一条SQL语句实现
xiequan2 2009-08-25
  • 打赏
  • 举报
回复
DECLARE @T TABLE (NAME VARCHAR(1),TYPE VARCHAR(4),NUM INT)
INSERT INTO @T
SELECT 'A','在线',1 UNION ALL
SELECT 'B','修复',2 UNION ALL
SELECT 'A','修复',3 UNION ALL
SELECT 'B','在线',4 UNION ALL
SELECT 'D','在线',5 UNION ALL
SELECT 'D','修复',6 UNION ALL
SELECT 'F','修复',7 UNION ALL
SELECT 'C','在线',8 UNION ALL
SELECT 'C','在线',9 UNION ALL
SELECT 'E','在线',10 UNION ALL
SELECT 'E','修复',11 UNION ALL
SELECT 'E','修复',12


select [name] from @t t group by [name]
having count(type)=(select count(*) from @T where name=t.name and type='在线' )

/*
name
c
*/
feixianxxx 2009-08-25
  • 打赏
  • 举报
回复
--如果类型只有2种 还可以这样
-- =========================================
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================

IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( NAME varchar(10), TYPE varchar(10) , NUM int )
go
insert tb SELECT
'A' , '在线', 1 UNION ALL SELECT
'B' ,'修复' , 2 UNION ALL SELECT
'A' , '修复' , 3 UNION ALL SELECT
'B' ,'在线' , 4 UNION ALL SELECT
'D' , '在线' , 5 UNION ALL SELECT
'D' , '修复' , 6 UNION ALL SELECT
'F' ,'修复' , 7 UNION ALL SELECT
'C' , '在线' , 8 UNION ALL SELECT
'C' , '在线' , 9 UNION ALL SELECT
'E' , '在线' , 10 UNION ALL SELECT
'E' , '修复' , 11 UNION ALL SELECT
'E' , '修复' , 12
go
select *
from tb a
where not exists(select * from tb where a.name=name and [type]='修复')
go

NAME TYPE NUM
---------- ---------- -----------
C 在线 8
C 在线 9
--小F-- 2009-08-25
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-08-25 16:48:48
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([NAME] varchar(1),[TYPE] varchar(4),[NUM] int)
insert [tb]
select 'A','在线',1 union all
select 'B','修复',2 union all
select 'A','修复',3 union all
select 'B','在线',4 union all
select 'D','在线',5 union all
select 'D','修复',6 union all
select 'F','修复',7 union all
select 'C','在线',8 union all
select 'C','在线',9 union all
select 'E','在线',10 union all
select 'E','修复',11 union all
select 'E','修复',12 union all
select 'F','修复',13
--------------开始查询--------------------------
select
*
from
tb t
where
not exists(select * from tb where name=t.name and [type]<>'在线')
----------------结果----------------------------
/*NAME TYPE NUM
---- ---- -----------
C 在线 8
C 在线 9

(2 行受影响)
*/
liangCK 2009-08-25
  • 打赏
  • 举报
回复
-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-25 16:49:05
-------------------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (NAME VARCHAR(1),TYPE VARCHAR(4),NUM INT)
INSERT INTO @T
SELECT 'A','在线',1 UNION ALL
SELECT 'B','修复',2 UNION ALL
SELECT 'A','修复',3 UNION ALL
SELECT 'B','在线',4 UNION ALL
SELECT 'D','在线',5 UNION ALL
SELECT 'D','修复',6 UNION ALL
SELECT 'F','修复',7 UNION ALL
SELECT 'C','在线',8 UNION ALL
SELECT 'C','在线',9 UNION ALL
SELECT 'E','在线',10 UNION ALL
SELECT 'E','修复',11 UNION ALL
SELECT 'E','修复',12

--SQL查询如下:

SELECT * FROM @T AS A
WHERE NOT EXISTS(SELECT * FROM @T WHERE A.name = name AND type <> '在线')

/*
NAME TYPE NUM
---- ---- -----------
C 在线 8
C 在线 9

(2 row(s) affected)
*/
feixianxxx 2009-08-25
  • 打赏
  • 举报
回复
-- =========================================
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================

IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( NAME varchar(10), TYPE varchar(10) , NUM int )
go
insert tb SELECT
'A' , '在线', 1 UNION ALL SELECT
'B' ,'修复' , 2 UNION ALL SELECT
'A' , '修复' , 3 UNION ALL SELECT
'B' ,'在线' , 4 UNION ALL SELECT
'D' , '在线' , 5 UNION ALL SELECT
'D' , '修复' , 6 UNION ALL SELECT
'F' ,'修复' , 7 UNION ALL SELECT
'C' , '在线' , 8 UNION ALL SELECT
'C' , '在线' , 9 UNION ALL SELECT
'E' , '在线' , 10 UNION ALL SELECT
'E' , '修复' , 11 UNION ALL SELECT
'E' , '修复' , 12
go
select *
from tb a
where not exists(select * from tb where a.name=name and [type]<>'在线')
go

NAME TYPE NUM
---------- ---------- -----------
C 在线 8
C 在线 9
liangCK 2009-08-25
  • 打赏
  • 举报
回复
SELECT * FROM tb AS A
WHERE NOT EXISTS(SELECT * FROM tb WHERE A.name = name AND type <> '在线')
feixianxxx 2009-08-25
  • 打赏
  • 举报
回复
select *
from tb a
where not exists(select * from tb where a.name=name and [type]<>'在线')

34,590

社区成员

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

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