我需要从表(img 1)中获取数据,并放在同一行(img 2)
我该怎么做?
它必须在SQL Server上
我已经尝试过在select中进行选择,但是我认为我不知道这样做的正确方法,或者如果这样做不行。
select * from tblTest
where exists(select * from tblTest)
我有什么
我需要什么
答案 0 :(得分:0)
这是对OP的最后一条评论的猜测:“我要说的是,每3行,我需要全部包含1行。” 。我怀疑他们因此想要:
WITH CTE AS(
SELECT {YourColumns},
ROW_NUMBER() OVER (ORDER BY ID) - 1 AS RN
FROM {YourTable})
SELECT {YourColumns}
FROM CTE C1
LEFT JOIN CTE C2 ON C1.RN + 1 = C2.RN
LEFT JOIN CTE C3 ON C2.RN + 1 = C3.RN
WHERE C1.RN % 3 = 0;
您需要用相应的对象名称替换括号({}
)中的部分。另外,请注意,除了很小的数据集外,这很可能在其他任何地方都表现不佳。该查询远非SARGable。
编辑:关于您帖子中的查询,我担心这没有任何意义。
select * from tblTest
where exists(select * from tblTest)
这实际上是在声明“如果表tblTest
中有行,则返回表tblTest
中的所有行和列。因此EXISTS
完全没有意义,就像tblTest
中没有行,则SELECT
仍将不返回任何行。检查行是否存在只能对表进行进一步扫描。
您似乎对SQL还是很陌生,所以首先在线查找一些教程和指南可能是一个主意,以便您掌握基础知识。
答案 1 :(得分:0)
我认为您正在寻找
CREATE TABLE T(
ID INT,
Aux INT,
Test1 VARCHAR(10),
Test2 VARCHAR(10),
Test3 VARCHAR(10)
);
INSERT INTO T VALUES
(1, 10, 'ABC', 'DEF', 'GHI'),
(2, 11, '123', '456', '789'),
(3, 12, 'Foo', 'Bar', 'None');
SELECT T2.*,
T1.*
FROM T T1 RIGHT JOIN T T2 ON T1.ID = T2.ID +1
WHERE T2.ID % 2 > 0;
返回:
+----+-----+-------+-------+-------+------+------+-------+-------+-------+
| ID | Aux | Test1 | Test2 | Test3 | ID | Aux | Test1 | Test2 | Test3 |
+----+-----+-------+-------+-------+------+------+-------+-------+-------+
| 1 | 10 | ABC | DEF | GHI | 2 | 11 | 123 | 456 | 789 |
| 3 | 12 | Foo | Bar | None | NULL | NULL | NULL | NULL | NULL |
+----+-----+-------+-------+-------+------+------+-------+-------+-------+
更新:
INSERT INTO T VALUES
(1, 10, 'ABC', 'DEF', 'GHI'),
(2, 11, '123', '456', '789'),
(3, 12, 'Foo', 'Bar', 'None'),
(4, 13, 'JKL', 'MNO', 'PQR'),
(5, 13, 'STU', 'VWX', 'XZ!'),
(6, 14, 'AZE', 'RTY', 'UIO');
SELECT *
FROM T T1 LEFT JOIN T T2 ON T2.ID - 1 = T1.ID
LEFT JOIN T T3 ON T3.ID - 1 = T2.ID
WHERE T1.ID % 3 = 1;
返回:
+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+
| ID | Aux | Test1 | Test2 | Test3 | ID | Aux | Test1 | Test2 | Test3 | ID | Aux | Test1 | Test2 | Test3 |
+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+
| 1 | 10 | ABC | DEF | GHI | 2 | 11 | 123 | 456 | 789 | 3 | 12 | Foo | Bar | None |
| 4 | 13 | JKL | MNO | PQR | 5 | 13 | STU | VWX | XZ! | 6 | 14 | AZE | RTY | UIO |
+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+
答案 2 :(得分:0)
假设表中的行多于2或3行,则将需要动态sql。以下方法可以解决问题。
USE tempdb;
GO
SET NOCOUNT ON;
IF OBJECT_ID('tempdb.dbo.TestData', 'U') IS NOT NULL
BEGIN DROP TABLE dbo.TestData; END;
CREATE TABLE dbo.TestData (
ID INT NOT NULL,
Aux INT NOT NULL,
Test1 CHAR(3) NOT NULL,
Test2 CHAR(3) NOT NULL,
Test3 CHAR(3) NOT NULL
);
INSERT dbo.TestData (ID, Aux, Test1, Test2, Test3) VALUES
(1, 10, 'ABC', 'DEF', 'GHI'),
(2, 11, '123', '456', '789');
-- SELECT * FROM dbo.TestData td;
--=============================================================
DECLARE
@sql NVARCHAR(MAX) = N'',
@debug BIT = 0;
SELECT TOP (2147483647)
@sql = CONCAT(@sql, N',
ID = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ', td.ID , N' END),
AUX = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ', td.Aux, N' END),
Test1 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test1, N''' END),
Test2 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test2, N''' END),
Test3 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test3, N''' END)'
)
FROM
dbo.TestData td
ORDER BY
td.ID;
SET @sql = CONCAT(N'
SELECT', STUFF(@sql, 1, 1, ''), N'
FROM
dbo.TestData td;');
IF @debug = 1
BEGIN
PRINT(@sql);
END;
ELSE
BEGIN
EXEC sys.sp_executesql @sql;
END;
结果:
ID AUX Test1 Test2 Test3 ID AUX Test1 Test2 Test3
----------- ----------- ----- ----- ----- ----------- ----------- ----- ----- -----
1 10 ABC DEF GHI 2 11 123 456 789