2017-10-10 61 views
1

我有一个表'mat'列x,y,数据,其中(x,y)是多列主键,所以表格包含矩阵形式的数据。问题是如何选择多行的时候我有一个密钥对“向量”,并有可能重复对:如何通过在SQL中重复非唯一查询值来返回多行?

SELECT x,y,data FROM mat WHERE (x,y) IN ((0,0),(0,0),(1,1)); 

颇显返回​​

x | y | data 
--+---+----- 
0 | 0 | 5 
1 | 1 | 7 

,而我需要:

x | y | data 
--+---+----- 
0 | 0 | 5 
0 | 0 | 5 
1 | 1 | 7 

我可以从外部(在C++ /任何代码中)循环密钥对以获取正确的数据,但是存在主要的性能下降,这非常关键。有什么建议么?可能吗?帮助赞赏!

+2

主键是唯一的,不能包含重复项。您的{x,y}对包含重复项,并且不能是PK。 – joop

+0

请将主键改为主题中的其他内容(例如改为“值”)或从中删除“非唯一” - 否则听起来有缺陷 –

+0

主键本身在表中是唯一的,但我有一个数据向量值(x0,y0)...(xn,yn)其中可以有重复值 – Streamsoup

回答

3

我认为你需要一个JOIN这个

SELECT mat.x,mat.y,data 
FROM mat 
JOIN 
(
    SELECT 0 x, 0 y 
    UNION ALL 
    SELECT 0 x, 0 y 
    UNION ALL 
    SELECT 1 x, 1 y 
) t ON t.x = mat.x and t.y = mat.y 

demo

IN只是评估,以true/false/unknown的每一行,它无法复制您的数据。

+0

尝试用mat(x,y,data)as(values(0,0,'a'),(1,1 (0,0,'c'))SELECT x,y,data FROM mat WHERE(x,y)IN((0,0),(0,0),(1,1)) ;' - 不是IN或join是我相信的问题 –

+0

@VaoTsun'mat'表不能包含具有相同'(x,y)'值的两行,因为'x'和'y'是主键 –

+0

你似乎更好地理解问题,然后我想我:)我认为没有PK - OP只调用这种方式 –

1

Radim有正确的想法。我更喜欢这种语法:

SELECT m.* 
FROM mat m JOIN 
    (VALUES (0, 0), (0, 0), (1, 1)) v(x, y) 
    ON m.x = v.x and m.y = v.y; 
+0

太棒了!谢谢。 – Streamsoup