sql - SQL 查询 - 合并具有相同值的两种类型的对象
问题描述
我想找到具有相同速度和内存的 PC 型号对。这些对仅列出一次。这是我的数据和期望的结果:
我确实得到了结果,但是查询太长了,我知道有更短的方法。希望大家帮助我。
这是我的查询
DECLARE @FOR INT = 1
DECLARE @SPEED INT
DECLARE @RAM INT
DECLARE @MODEL INT
DECLARE @LIST TABLE(SPEED INT, RAM INT)
DECLARE @LISTMODEL TABLE(MODEL INT)
DECLARE @RESULT TABLE(PC1 INT, PC2 INT)
DECLARE @RESULTREAL TABLE(COUPLE NVARCHAR(20), SPEED INT, RAM INT)
DECLARE @COUNT INT
WHILE(1=1)
BEGIN
IF(NOT EXISTS(SELECT TOP(1) SPEED FROM @LIST))
BEGIN
INSERT @LIST(SPEED,RAM)
SELECT speed,ram
FROM VW_count
END
BREAK
END
SET @COUNT = (SELECT COUNT(SPEED) FROM @LIST)
WHILE @FOR <= @COUNT
BEGIN
SET @SPEED = (SELECT KETQUA.SPEED FROM (SELECT ROW_NUMBER() OVER (ORDER BY SPEED) AS STT, SPEED FROM @LIST) AS KETQUA WHERE KETQUA.STT = 1)
SET @RAM = (SELECT KETQUA.RAM FROM (SELECT ROW_NUMBER() OVER (ORDER BY RAM) AS STT, RAM FROM @LIST) AS KETQUA WHERE KETQUA.STT = 1)
IF @SPEED IS NULL
BEGIN
BREAK
END
ELSE
BEGIN
IF(EXISTS(SELECT speed FROM PC WHERE speed = @SPEED AND ram = @RAM))
BEGIN
INSERT @LISTMODEL(MODEL)
SELECT model FROM PC WHERE speed = @SPEED AND ram = @RAM
INSERT @RESULT(PC1,PC2)
SELECT DISTINCT L1.MODEL, L2.MODEL FROM @LISTMODEL AS L1 , @LISTMODEL AS L2
INSERT @RESULTREAL(COUPLE,SPEED,RAM)
SELECT CONCAT(R1.PC1, ', ', R1.PC2), @SPEED, @RAM FROM @RESULT R1 WHERE R1.PC1 > R1.PC2 OR NOT EXISTS (SELECT * FROM @RESULT R2 WHERE R2.PC1 = R1.PC2 AND R1.PC2 = R2.PC1)
END
DELETE @RESULT
DELETE @LISTMODEL
END
SET @FOR = @FOR + 1
DELETE TOP(1) FROM @LIST
CONTINUE
END
SELECT * FROM @RESULTREAL
解决方案
当您还可以使用基于集合的逻辑时,使用过程语句通常是个坏主意。
[PC]
您可以根据[speed]
and[ram]
字段的值对表使用自联接进行 SELECT 查询,但[model]
第二个表的值大于第一个表的值。像这样的东西:
DECLARE @RESULTREAL TABLE(COUPLE NVARCHAR(20), SPEED INT, RAM INT);
INSERT INTO @RESULTREAL
SELECT
CAST(T1.[model] AS NVARCHAR) + N', ' + CAST(T2.[model] AS NVARCHAR),
T1.[speed],
T1.[ram]
FROM
[PC] AS T1
INNER JOIN [PC] AS T2 ON
T2.[speed] = T1.[speed] AND
T2.[ram] = T1.[ram]
WHERE
T2.[model] > T1.[model];
推荐阅读
- sql-server - 每次更新 IIS 托管的 .net 核心应用程序后,与 SQL 服务器的连接失败
- protocol-buffers - grpc/protobuffer 请求特定字段
- python - 从 wine 编译时出现 Cx_Freeze 错误
- flutter - 如何防止底片消失颤动
- c++ - 有没有办法用复合键和复合值创建一个 STL 映射?
- ios - 有没有办法通过 telprompt URL 方案从 iOS 应用程序进行隐藏调用?
- postman - Clockify Api - 获取过去 24 小时内每个用户的小时数
- eclipse-scout - 如何从 Scout 客户端代码访问请求 HttpSession?
- typescript - 条件类型中的 boolean[] 扩展为 true[] | 错误的[]
- android - 用于搜索查询的 Android 分页