qsl 语句

聆听风的呼唤 2012-08-07 09:20:51

表A 表B
ID 书名 类型 书名 类型 时间
1 三国 小说 三国 小说 2011-01-01
2 水浒 小说 水浒 小说 2011-01-02
3 萌芽 null 萌芽 刊物 2011-01-03
4 柯南 漫画 三国 null 2011-01-04
5 死神 漫画 null 漫画 2011-01-05



表A ID 和书名 是唯一且 不能为空 表B 时间 不能为空 书名和类型 可以为空 但不能同时为空
要求: 当表B中 类型不为空时 以类型为连接 获取ID 并且时间为最新的 如 4 柯南 漫画 2011-01-05
当类型为空时 以书名为连接 获取ID 并且时间为最新的 如 1 三国 2011-01-4

...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
筱筱澄 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

SQL code
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([ID] INT,[shuming] VARCHAR(4),[leixing] VARCHAR(4))
INSERT [ta]
SELECT 1,'三国','小说' UNION ALL
SELECT 2,'水浒……
[/Quote]
应该在加一个条件



--> 测试语句:
SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join [tb] as b
on a.[shuming]=b.[shuming]
where b.[leixing] is null
and not exists (select 1 from [tb] where [shuming]=b.[shuming] and [time]>b.[time])
union
SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join [tb] as b
on a.[leixing]=b.[leixing]
where b.[shuming] is null
and not exists (select 1 from [tb] where [leixing]=b.[leixing] and [time]>b.[time])
聆听风的呼唤 2012-08-08
  • 打赏
  • 举报
回复
谢谢 各位了 嘻嘻 结贴
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([ID] INT,[shuming] VARCHAR(4),[leixing] VARCHAR(4))
INSERT [ta]
SELECT 1,'三国','小说' UNION ALL
SELECT 2,'水浒','小说' UNION ALL
SELECT 3,'萌芽',NULL UNION ALL
SELECT 4,'柯南','漫画' UNION ALL
SELECT 5,'死神','漫画'
GO


IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([shuming] VARCHAR(4),[leixing] VARCHAR(4),[time] DATETIME)
INSERT [tb]
SELECT '三国','小说','2011-01-01 00:00:00.000' UNION ALL
SELECT '水浒','小说','2011-01-02 00:00:00.000' UNION ALL
SELECT '萌芽','刊物','2011-01-03 00:00:00.000' UNION ALL
SELECT '三国',NULL,'2011-01-04 00:00:00.000' UNION ALL
SELECT NULL,'漫画','2011-01-05 00:00:00.000'
GO

--> 测试语句:
SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join [tb] as b
on a.[shuming]=b.[shuming] where b.[leixing] is null
union
SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join [tb] as b
on a.[leixing]=b.[leixing] where b.[shuming] is null
/*
id shuming leixing time
----------- ------- ------- -----------------------
1 三国 小说 2011-01-04 00:00:00.000
4 柯南 漫画 2011-01-05 00:00:00.000
5 死神 漫画 2011-01-05 00:00:00.000

(3 行受影响)


*/
以学习为目的 2012-08-07
  • 打赏
  • 举报
回复

--上面明显错误,sorry
--测试数据
DECLARE @TA TABLE(ID int,shuming varchar(10),leixing varchar(10))

DECLARE @TB TABLE(shuming varchar(10),leixing varchar(10),time datetime)

INSERT INTO @TA
SELECT '1','三国','小说'UNION ALL
SELECT '2','水浒','小说'UNION ALL
SELECT '3','萌芽','null'UNION ALL
SELECT '4','柯南','漫画'UNION ALL
SELECT '5','死神','漫画'

INSERT INTO @TB
SELECT '三国','小说','2011-01-01'UNION ALL
SELECT '水浒','小说','2011-01-02'UNION ALL
SELECT '萌芽','刊物','2011-01-03'UNION ALL
SELECT '三国','null','2011-01-04'UNION ALL
SELECT 'null','漫画','2011-01-05'

--查询
select A.ID,A.shuming,MAX(B.time) as B.time ,(case when B.leixing is not null then B.leixing else '' end) as B.leixing
from @TA A left join @TB B on A.leixing=B.leixing
union all
select A.ID,B.shuming,B.time,(case when B.leixing is null then null else '' end) as B.leixing
from @TA A left join @TB B on A.shuming=B.shuming
以学习为目的 2012-08-07
  • 打赏
  • 举报
回复

select * from
(
case when B.leixing is not null then
(select A.ID,A.shuming,A.leixing,MAX(B.time) from A left join B
on A.leixing=B.leixing)
else
(select A.ID,B.shuming,B.time from A left join B
on A.shuming=B.shuming )
end
)t
人生无悔 2012-08-07
  • 打赏
  • 举报
回复

select ID,书名,max(时间) 时间
from(
select ID,A.书名,A.类型,B.时间
from A inner join B on (A.书名=B.书名 or A.类型=B.类型))t
group by t.ID,t.书名
order by t.ID

34,588

社区成员

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

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