可能的自联接以获取所有匹配列的ID

时间:2014-03-04 13:28:50

标签: sql linq sqlite

给出一个sqlite数据库中的表 ID,名称,价值

ID不是唯一的,因为它可以有多个名称和值,而不是每个ID都具有相同的名称和值。

现在我需要查询此表,以便我可以找到多个匹配的名称值对,它们具有相同的ID。基本上搜索最匹配名称值对的id。

例如,我需要找到最符合以下名称值的ID。

+---------+--------+
|  Name   | Value  |
+---------+--------+
| Product | Foobar |
|  Colour | Blue   |
+---------+--------+
来自

等数据的

1, Product, Foobar
1, Colour, Blue
1, Size, Large
2, Product, Xeon
2, Colour, Blue
2, Size, Large
2, Type, inline
3, Product, Foobar
3, Colour, Green
3, Size, Large
4, Product, Xeon
4, Colour, Blue
4, Size, Small
5, Product, Foobar
5, Colour, Blue
5, Size, Small
6, Product, Argon
6, Layer, 1
6, Colour, Pink

并非所有项目都具有相同的名称,而有些名称则更少。

我可能愿意重组,如果这会有所帮助,可以通过LINQ查询

2 个答案:

答案 0 :(得分:1)

此查询首先抛出任何与您的条件不符的记录,然后计算每个ID的剩余匹配数:

SELECT ID,
       COUNT(*) AS matches
FROM MyTable
WHERE (Name = 'Product' AND Value = 'Foobar')
   OR (Name = 'Colour'  AND Value = 'Blue'  )
GROUP BY ID
ORDER BY matches DESC

SQLFiddle

要仅获取第一个结果记录,请添加LIMIT 1

答案 1 :(得分:0)

扩展CL。的想法:

SELECT * 
FROM MyTable 
WHERE ID in (SELECT ID
             FROM MyTable
             WHERE (Name = 'Product' AND Value = 'Foobar')
                OR (Name = 'Colour'  AND Value = 'Blue'  )
             GROUP BY ID
             HAVING COUNT(*) = 2)