【发布时间】:2018-02-07 21:12:48
【问题描述】:
由于 FUNCCODE 在 POSCODE 和 DEVCODE 之间共享,因此我不能同时调用两者来消除空值以将数据插入到名为 JOINT 的单独表中。 POSCODE 和 DEVCODE 是 FK。我知道必须有一种更简单的方法来做到这一点。在过去的两周里,我试图制定一个解决方案......感觉就像我不明白要完成这项工作的一件事。任何建议表示赞赏。
表设置
FUNCCODE | POSCODE | DEVCODE
11 1 NULL
12 NULL 1
13 2 NULL
14 NULL 2
该表需要重新排列,然后插入到一个名为 JOINT 的单独表中,该表设置为:
POSCODE | POSFUNCCODE |DEVCODE | DEVFUNCCODE
1 11 1 12
2 13 2 14
我的一些尝试 XD
每个连接只创建我需要的 2 列
SELECT
dbo.POSITION.POSCODE AS POSCODE,
dbo.FUNC.FUNCCODE AS POSFUNCCODE
FROM FUNC
INNER JOIN POSITION ON dbo.POSITION.POSCODE = dbo.FUNC.POSCODE
UNION ALL
SELECT
dbo.DEVICE.DEVCODE AS DEVCODE,
dbo.FUNC.FUNCCODE AS DEVFUNCCODE
FROM FUNC
INNER JOIN DEVICE ON dbo.DEVICE.DEVCODE = dbo.FUNC.DEVCODE
ORDER BY 1;
只插入最后一行的值
DECLARE @DATE DATETIME = GETDATE()
DECLARE @PC INT;
SELECT @PC = POSCODE
FROM func
WHERE poscode != 0
ORDER BY 1;
DECLARE @FCP INT;
SELECT @FCP = FUNCCODE
FROM FUNC
WHERE POSCODE != 0
ORDER BY 1;
DECLARE @DC INT;
SELECT @DC = devcode
FROM func
WHERE devcode != 0
ORDER BY 1;
DECLARE @FCD INT
SELECT @FCD = FUNCCODE
FROM FUNC
WHERE DEVCODE != 0
ORDER BY 1
INSERT INTO JOINT (POSCODE, POSFUNCCODE, DEVCODE, DEVFUNCCODE, JOINTTIME,
JOINTSTATUS)
VALUES (@PC, @FCP, @DC, @FCD, @DATE, 1)
【问题讨论】:
-
那么如果
POSCODE=1那么DEVCODE=1他们应该如何匹配? -
另外,SQL 的版本和风格是什么?
-
@Shawn MS SQL Express 2012,是的!
-
根据您对@user4219031 的回答的评论,您能否更新原始问题中的架构以包括 POSITION、DEVICE 和 FUNC 表以及它们之间的关系?原来的帖子听起来好像都在一张桌子上。这开始成为一个 XY 问题。 :-S xyproblem.info
-
另外,您是否要从
POSITION或DEVICE中获取另一列?如果您只需要POSCODE和DEVCODE,则上述查询不需要JOIN;这些列已经在FUNC中。直接查询该表即可。我认为我们需要更多关于您要解决的完整问题的数据。
标签: sql-server tsql join union sql-insert