我有一个包含字段group_id和group_type的表,我想从表中查询具有元组列表中任何元组(组ID,组类型)的所有记录.例如,我希望能够做到这样的事情:
SELECT *
FROM mytable
WHERE (group_id, group_type) IN (("1234-567", 2), ("4321-765", 3), ("1111-222", 5))
Run Code Online (Sandbox Code Playgroud)
一个非常类似的问题已经在:使用sql in子句中的元组,但是在那里提出的解决方案假定元组列表是从另一个表中获取的.这在我的情况下不起作用是元组值是硬编码的.
一种解决方案是使用字符串连接:
SELECT *
FROM mytable
WHERE group_id + STR(group_type, 1) IN ("1234-5672", "4321-7653", "1111-2225")
Run Code Online (Sandbox Code Playgroud)
但问题是该表非常大,并且对每个记录执行字符串连接和转换将非常昂贵.
有什么建议吗?
在我当前的应用程序中,我需要能够执行此类查询:
SELECT MIN((colA, colB, colC))
FROM mytable
WHERE (colA, colB, colC) BETWEEN (200, 'B', 'C') AND (1000, 'E', 'F')
Run Code Online (Sandbox Code Playgroud)
并得到(333, 'B', 'B')这个数据的答案:
+------+------+------+
| colA | colB | colC |
+------+------+------+
| 99 | A | A |
| 200 | A | Z |
| 200 | B | B |
| 333 | B | B |
| 333 | C | D |
| 333 | C | E |
| 333 | D | …Run Code Online (Sandbox Code Playgroud) 给定这样的数据库:
BEGIN TRANSACTION;
CREATE TABLE aTable (
a STRING,
b STRING);
INSERT INTO aTable VALUES('one','two');
INSERT INTO aTable VALUES('one','three');
CREATE TABLE anotherTable (
a STRING,
b STRING);
INSERT INTO anotherTable VALUES('one','three');
INSERT INTO anotherTable VALUES('two','three');
COMMIT;
Run Code Online (Sandbox Code Playgroud)
我想做一些事情
SELECT a,b FROM aTable
WHERE (aTable.a,aTable.b) IN
(SELECT anotherTable.a,anotherTable.b FROM anotherTable);
Run Code Online (Sandbox Code Playgroud)
得到答案'一','三',但我得到"接近",":语法错误"
这有可能在SQL的任何风格?(我正在使用sqlite)
我是否犯了严重的概念错误?或者是什么?
我在SQLite3数据库中具有下表:
CREATE TABLE overlap_results (
neighbors_of_annotation varchar(20),
other_annotation varchar(20),
set1_size INTEGER,
set2_size INTEGER,
jaccard REAL,
p_value REAL,
bh_corrected_p_value REAL,
PRIMARY KEY (neighbors_of_annotation, other_annotation)
);
Run Code Online (Sandbox Code Playgroud)
我想执行以下查询:
SELECT * FROM overlap_results WHERE
(neighbors_of_annotation, other_annotation)
IN (('16070', '8150'), ('16070', '44697'));
Run Code Online (Sandbox Code Playgroud)
也就是说,我有几个带注释ID的元组,我想获取每个这些元组的记录。sqlite3提示给我以下错误:
SQL error: near ",": syntax error
Run Code Online (Sandbox Code Playgroud)
如何正确将其表示为SQL语句?
编辑我意识到我并没有很好地解释我真正的追求。让我再尝试一下。
如果某人给我neighbors_of_annotation他们感兴趣的任意术语列表,我可以编写如下的SQL语句:
SELECT * FROM overlap_results WHERE
neighbors_of_annotation
IN (TERM_1, TERM_2, ..., TERM_N);
Run Code Online (Sandbox Code Playgroud)
但现在假设这个人想给我双方面的,如果形式(TERM_1,1, TERM_1,2),(TERM_2,1, TERM_2,2),... (TERM_N,1, TERM_N,2),这里TERM_i,1是neighbors_of_annotation和TERM_i,2是other_annotation。SQL语言是否提供同样优雅的方法来为感兴趣的对(元组)制定查询?
最简单的解决方案似乎是为这些对创建一个新表,然后将该表与要查询的表连接起来,并仅选择第一项和第二项匹配的行。创建大量 …
是否可以在SQL查询的子句中比较元组(thanks,a_horse_with_no_name)WHERE?那样,我可以转换这个:
/* This is actually a sub-sub-sub-query in the middle *
* of an incredibly complex stored procedure. */
SELECT ISNULL(SUM(DT.DetailField), 0)
FROM DetailTable DT
WHERE DT.ForeignKey = ...
AND EXISTS (/* I know this sub-sub-sub-sub-query *
* will return at most one row. */
SELECT 'X'
FROM HeaderTable HT
WHERE HT.HeaderKey = DT.HeaderKey
AND HT.HeaderField1 = ...
AND HT.HeaderField2 = ...)
Run Code Online (Sandbox Code Playgroud)
进入类似的东西:
SELECT ISNULL(SUM(DetailField), 0)
FROM DetailTable DT
WHERE DT.ForeignKey = ...
AND (SELECT HT.HeaderField1, …Run Code Online (Sandbox Code Playgroud) 试着和这个问题做同样的事情,但这次是在sqlite中.在我当前的应用程序中,我需要能够执行此类查询:
SELECT First, Last, Score
FROM mytable
WHERE
('John', 'Jordan', 5) <= (First, Last, Score )
AND (First, Last, Score) <= ('Mike', 'Taylor', 50)
ORDER BY First, Last, Score
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
并得到('Liz', 'Jordan', 2)这个数据的答案:
+-------+---------+-------+
| First | Last | Score |
+-------+---------+-------+
| Liz | Jordan | 2 |
| John | Jordan | 2 |
| Liz | Lemon | 10 |
| Mike | Taylor | 100 |
| John | Jackson | …Run Code Online (Sandbox Code Playgroud) 假设您有Accounts一个表,其中ID列是 PK 并且TaxID+AccountNumber是唯一约束:
select * from Accounts where ID in (100, 101)
Run Code Online (Sandbox Code Playgroud)
现在您想使用自然键进行类似的查询:
select * from Accounts
where {TaxID, AccountNumber} in
({"0123456", "2000897"}, {"0125556", "2000866"})
Run Code Online (Sandbox Code Playgroud)
所以这涉及元组并且看起来非常合法。是否可以用 ANSI SQL 来表达?也许在某些特定的 SQL 扩展中?如果不是,为什么(欢迎任何猜测)?
让我们来看看Oracle SQL,它完美地运行:
样本数据:
SQL> create table test (a number, b number);
SQL> insert into test values(1, 1);
SQL> insert into test values(1, 2);
SQL> insert into test values(1, 3);
SQL> insert into test values(1, 4);
SQL> insert into test values(1, 5);
SQL> insert into test values(2, 1);
SQL> insert into test values(2, 2);
SQL> insert into test values(2, 3);
SQL> insert into test values(2, 4);
SQL> insert into test values(2, 5);
SQL> insert into test values(4, 1);
SQL> select * …Run Code Online (Sandbox Code Playgroud) 空值和所有列均为空的行类型之间是否有区别?Postgres查询似乎能够分辨出差异(显示空列而不是空白),我想知道是否有什么我应该注意的。例如
CREATE TYPE node AS (
rank integer
, id integer
);
CREATE TABLE hierarchy (
node node
);
INSERT INTO hierarchy (node) VALUES (null);
INSERT INTO hierarchy (node) VALUES ((null, null));
SELECT *, node IS NULL AS check_null FROM hierarchy;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)node | check_null ------+------------ | t (,) | t
postgresql null distinct row-value-expression postgresql-9.6
我的应用程序最初有一个类似于这个的查询: -
SELECT column_name from PERSON
WHERE name in (list);
Run Code Online (Sandbox Code Playgroud)
其中list是逗号分隔列表.
但是,现在需求已经改变,我必须查询具有名称和年龄的Persons表.我有nameAgeList.
最初,我认为类似于此的查询将起作用(从nameAgeList创建nameList和ageList)
SELECT column_name from Person
WHERE name in (nameList)
AND age in (ageList)
Run Code Online (Sandbox Code Playgroud)
但经过仔细思考,这似乎是一个错误的查询.
请告诉我如何继续进行此查询.