用SQL语句做,重复的数据只显示一条,其它重复相同的为空

hiu1989 2013-08-03 05:47:01
目前我有A、B、C三张表。我主要想用SQL语句查询显示图片中的‘查询结果’,A表中重复的keyjobno,name只显示一条记录,但B表、C表中的数据需要全部显示出来,请高手指点一下,不能用临时表



...全文
907 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiu1989 2013-08-06
  • 打赏
  • 举报
回复
谢谢wwwwgou的解答,是一个SQL高手。虽然在ACCESS不能用,但也给了我参考的价值。 @liurui1985,branchno是语法吗?我还没用过这个。本来我打算在每张表中都加一个条形码字段来关联的,因为每张表操作时都是独立的,这样一来,每张表的条形码就不能统一了,虽然也有办法弄到每个表的每个KEYJOBNO的值都有一个相对应的条形码,但比较麻烦。
liurui1985 2013-08-05
  • 打赏
  • 举报
回复
楼主,我觉得这表的设计不太好,只是通过keyjobno来关联,为什么不在keyjobno后加一个branchno。每张表里同一个keyjobno,让branchno来递增,这样也好关联。
Shawn 2013-08-05
  • 打赏
  • 举报
回复
--#1.拼字段串的话,'号需要转义成''
--#2.access不支持CTE,且不支持ROW_NUMBER函数,建议增加自增ID,且用只能用字查询实现
--#3.加个PARTITION BY keyjobno即可
;WITH
cte1 AS
(
    SELECT *, rowid=ROW_NUMBER() OVER(PARTITION BY keyjobno ORDER BY GETDATE()) FROM A表
),
cte2 AS
(
    SELECT *, rowid=ROW_NUMBER() OVER(PARTITION BY keyjobno ORDER BY GETDATE()) FROM B表
),
cte3 AS
(
    SELECT *, rowid=ROW_NUMBER() OVER(PARTITION BY keyjobno ORDER BY GETDATE()) FROM C表
)
SELECT
    keyjobno = (CASE a.rowid WHEN 1 THEN a.keyjobno ELSE '' end),
    [name] = (CASE a.rowid WHEN 1 THEN a.[name] ELSE '' end),
    a.marry,a.bear,a.other,b.indate,c.activity,c.[date]
FROM cte1 a
INNER JOIN cte2 b
ON a.keyjobno = b.keyjobno
    AND a.[name] = b.[name]
    AND a.rowid = b.rowid
INNER JOIN cte3 c
ON a.keyjobno = c.keyjobno
    AND a.[name] = c.[name]
    AND a.rowid = c.rowid
hiu1989 2013-08-05
  • 打赏
  • 举报
回复
@ wwwwgou,第二个问题我已经解决,问题在于sql语句的“else '' ”这里,sql语句在delphi中使用时,'要改为''这种形式。 with 在ACCESS中好像不去持你这种写法,另外,你这里的SQL语句只能对一个工号起作用,如果再增加一行,如keyjobno值等于2011,那么新增加的2011就显示不出来了
Shawn 2013-08-04
  • 打赏
  • 举报
回复
--access用IIF(条件,结果1,结果2),条件为true则取结果1,否则取结果2
--应该是你Delphi端取值方法不对。ADO的话,应该不会出现这种问题。请把你的相关代码,放到Delphi区去问问
hiu1989 2013-08-03
  • 打赏
  • 举报
回复
wwwwgou,首先谢谢你的解答。补充一下,A,B,C三个表之间的关联关系是keyjobno
你的代码我在SQL SERVER 2008测试过是OK的。

但现在我主要还有两个问题,不知你能不能再指点一下?
1、我现在数据库是用ACCESS的,但ACCESS里面不能用CASE WHEN 语法 。如果在ACCESS,SQL语句该怎样写?
2、我想在delphi 中用dbgrid显示我的查询结果,现在测试了一下,显示出来是这样的,看图:

在SQL SERVER2008用你的代码查询是没问题的,我在delphi 的ADOQuery1.sql.text查询中贴上你的代码,原本在SQL SERVER2008中第1列keyjobno第2、3行本是空白的,但dbgrid中显示的keyjobno列第2、3行就有了上图中的结果,还有dbgrid中不见了name字段。这是什么原因啊?求解?
Shawn 2013-08-03
  • 打赏
  • 举报
回复
--你这个有问题,没说明A,B,C三个表之间的记录的关联关系。
;WITH
cte1 AS
(
	SELECT *, rowid=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM A表
),
cte2 AS
(
	SELECT *, rowid=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM B表
),
cte3 AS
(
	SELECT *, rowid=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM C表
)
SELECT
	keyjobno = (CASE a.rowid WHEN 1 THEN a.keyjobno ELSE '' end),
	[name] = (CASE a.rowid WHEN 1 THEN a.[name] ELSE '' end),
	a.marry,a.bear,a.other,b.indate,c.activity,c.[date]
FROM cte1 a
INNER JOIN cte2 b
ON a.keyjobno = b.keyjobno
	AND a.[name] = b.[name]
	AND a.rowid = b.rowid
INNER JOIN cte3 c
ON a.keyjobno = c.keyjobno
	AND a.[name] = c.[name]
	AND a.rowid = c.rowid

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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