如何选择每行匹配不同条件的行集?
示例:
假设我有一个名为name的列的表,我想要结果只有第一行名称匹配'A',第二行名称匹配'B'而第三行名称匹配'C'。
修改
我想这样做是为了在没有固定大小的情况下工作,但在某种程度上我可以定义类似R
,X
,V
,P
,{的序列{1}}它与序列匹配,每个序列都在一行中,但按顺序排列。
答案 0 :(得分:2)
你可以,但可能不是你想要的方式:
如果你的表有一个数字id字段,每行增加,你可以自己加入该表3次(比如说“a”,“b”和“c”)并使用连接条件a。 id + 1 = b.id和b.id + 1 = c.id并将过滤器放在where子句中,例如:a.name ='A'AND b.name ='B'AND c.name ='C'
但不要期待表现......
答案 1 :(得分:1)
假设您知道如何为行提供行号(例如,SQL Server中的ROW_NUMBER()),您可以创建一个查找(匹配)表并加入它。请参阅以下说明:
LookupTable中:
RowNum Value
1 A
2 B
3 C
您的SourceTable源表(假设您已经向其添加了RowNum - 如果您没有,请为其引入子查询(或SQL Server 2005或更新版本的CTE):
RowNum Name
-----------
1 A
2 B
3 C
4 D
现在您需要在LookupTable.RowNum = SourceTable.RowNum AND LookupTable.Name = SourceTable.Name
上使用SourceTable内连接LookupTable。然后仅在RowNum上使用LookupTable对此结果进行左连接。如果最终结果中有LookupTable.RowNum IS NULL
,那么您知道至少有一行没有完全匹配。
以下是联接的代码:
SELECT T.*, LT2.RowNum AS Matched
FROM LookupTable LT2
LEFT JOIN
(
SELECT ST.*
FROM SourceTable ST
INNER JOIN LookupTable LT ON LT.RowNum = ST.RowNum AND LT.Name = ST.Name
) T
ON LT2.RowNum = T.RowNum
如果行与LookupTable表中的条件不匹配,则上述查询的结果集将包含Matched IS NULL
的行。
答案 2 :(得分:0)
我想你可以为每一行做一个子查询,但它不会表现良好或根本不能很好地扩展,并且难以维护。
答案 3 :(得分:0)
这可能接近你所追求的......但我需要知道你在哪里获得A,B,C等的价值......
Select [insert your fields here]
FROM
(Select T1.Name, T1.Age, RowNum as t1RowNum from T T1 order by name) T1O
Full Outer JOIN
(Select T2.Name, T2.Age, RowNum as T2rowNum From T T2 order By name) T2O
ON T1O.T1RowNum+1 = T2O.T2RowNum