【问题标题】:Selecting from a Database based on a list of unique pairs根据唯一对列表从数据库中选择
【发布时间】:2012-11-21 02:08:24
【问题描述】:

例如,如果给我下表

Id        Key             Value

 1          A             Alpha
 2          B             Alpha
 3          A             Charlie

我接受了输入 {(A, Charlie) 和 (B, Alpha)} 并要求返回我希望它返回 2 和 3 但不是 1 的所有 ID。

最好的方法是什么?我可以将它们全部合并到一个查询中(为了速度)还是必须为收到的每个值对运行重复查询。

【问题讨论】:

  • 您使用的是什么关系型数据库?输入是如何存储在变量或其他东西中的?您打算如何调用查询?
  • 我对 RDBMS 有点困惑,但我正在使用 postgre 并使用 java 使用 hibernate 访问数据库。
  • 注意,这是 Postgres 而不是 Postgre
  • Tomato Tomato.... 写的不好用
  • @Landister Tomat,番茄,更像:-P

标签: sql postgresql


【解决方案1】:

我认为 Postgresql 有最优雅的解决方案:

SELECT  *
FROM    T
WHERE   ("Key", "Value") IN (('B', 'Alpha'), ('A', 'Charlie'));

SQL Fiddle Example

在 SQL-SERVER 2008 及更高版本中,您可以使用 VALUES 来构建您的元组:

SELECT  T.*
FROM    T
        INNER JOIN
        (   VALUES
                ('B', 'Alpha'),
                ('A', 'Charlie')
        ) v (Key, Value)
            ON v.Key = T.Key
            AND v.Value = T.Value

SQL Fiddle Example

或者对于一个过程,您可以创建一个键值对类型并将其作为参数传递:

CREATE TYPE KeyValuePair AS TABLE ([Key] VARCHAR(1), [Value] VARCHAR(7));

DECLARE @T AS KeyValuePair
INSERT @T 
VALUES
    ('B', 'Alpha'),
    ('A', 'Charlie')


SELECT  T.*
FROM    T
        INNER JOIN @T v
            ON v.[Key] = T.[Key]
            AND v.Value = T.Value;

SQL Fiddle Example

对于 MySQL,我认为您可能只需要使用 AND/OR 构建它

SELECT  *
FROM    T
WHERE   (`Key` = 'A' AND `Value` = 'Charlie')
OR      (`Key` = 'B' AND `Value` = 'Alpha')

Example on SQL Fiddle

我对其他 DBMS 的了解有限,所以如果不是上述之一,抱歉,我无法提供更多帮助。

编辑(在a_horse_with_no_name的帮助下)

PostgreSQL 语法也适用于 Oracle(我认为是 DB2)

【讨论】:

  • PostgreSQL 语法也适用于 Oracle(我认为是 DB2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多