2017-10-10 60 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