我已经搜索过并搜索过,但我甚至不确定该怎么称呼它。我试图编写一个使用键值分割数据的SQL查询...
╔═══╦═══╦═══╗
║ a ║ d ║ g ║
║ b ║ e ║ h ║
║ c ║ f ║ i ║
╚═══╩═══╩═══╝
要...
intent.setType("text/*");
这叫什么,我该怎么做?
答案 0 :(得分:0)
这很有效,但很麻烦。
忽略#Test
的创建,因为您已有该表
IF OBJECT_ID('tempdb..#Test') IS NOT NULL
DROP TABLE #Test
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
DECLARE @i AS INTEGER
SET @i = 1
CREATE TABLE #Test
(Type INT
,Data CHAR(1))
INSERT INTO #Test
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(2, 'd'),
(2, 'e'),
(2, 'f'),
(3, 'g'),
(3, 'h'),
(3, 'i')
CREATE TABLE #Results
([1] CHAR(1)
,[2] CHAR(2)
,[3] CHAR(3))
WHILE @i <= (SELECT COUNT(*) FROM #Test WHERE Type = 1)
BEGIN
INSERT INTO #Results
SELECT
(SELECT TOP 1 Data FROM #Test WHERE Type = 1 AND Data NOT IN (SELECT [1] FROM #Results)) [1]
,(SELECT TOP 1 Data FROM #Test WHERE Type = 2 AND Data NOT IN (SELECT [2] FROM #Results)) [2]
,(SELECT TOP 1 Data FROM #Test WHERE Type = 3 AND Data NOT IN (SELECT [3] FROM #Results)) [3]
FROM #Test
SET @i = @i + 1
END
SELECT DISTINCT * FROM #Results
答案 1 :(得分:0)
一种方法可能是创建与组相同数量的辅助表。因此,您将创建table1
,table2
和table3
。
然后,您将第1组中的所有值SELECT DISTINCT
转换为table1
,依此类推。
现在您需要将这三个表拼接为新表中的列。为此,您需要另一个元素 - 计数器。根据您的SQL风格,您可以通过几种不同的方式执行此操作。
最后,您将有三个表格
Table1 Table2 Table3
id value id value id value
1 a 1 d 1 f
2 b 2 e 2 g
3 c 3 h
4 i
要将这些链接在一起,请选择最长的一个并与其他人一起运行LEFT JOIN
:
SELECT table1.value AS group1, table2.value AS group2, table3.value AS group3
FROM table3
LEFT JOIN table2 ON (table3.id = table2.id)
LEFT JOIN table1 ON (table3.id = table1.id);
并将获得
group1 group2 group3
a d f
b e g
c NULL h
NULL NULL i
您还可以使用一个附加列对原始表中的所有值进行增量分组编号:
xid group value
1 1 a
2 1 b
3 1 c
1 2 d
2 2 e
1 3 f
...
请注意(group,xid)现在是主键。现在你可以自己加入你的桌子了:
SELECT t1.value AS g1, t2.value AS g2, t3.value AS g3
FROM yourtable AS t3
LEFT JOIN yourtable AS t1 ON (t3.xid = t1.xid)
LEFT JOIN yourtable AS t2 ON (t3.xid = t2.xid)
此处,第3组是具有最大基数的组。这不需要额外的表,但是用于缝合枢轴的一个额外列xid
的编号稍微复杂一些。