相关疑难解决方法(0)

在SQL"IN"子句中使用元组

我有一个包含字段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)

但问题是该表非常大,并且对每个记录执行字符串连接和转换将非常昂贵.

有什么建议吗?

sql sql-server tuples row-value-expression

51
推荐指数
4
解决办法
4万
查看次数

IN与大型行集的JOIN

我想要在主表位于另一个表中的表中选择行.我不确定我是否应该在SQL Server 2005中使用JOIN或IN运算符.这两个SQL查询与大数据集(即数百万行)之间是否存在显着的性能差异?

SELECT *
FROM a
WHERE a.c IN (SELECT d FROM b)

SELECT a.*
FROM a JOIN b ON a.c = b.d
Run Code Online (Sandbox Code Playgroud)

sql performance join sql-server-2005

28
推荐指数
3
解决办法
1万
查看次数

INSERT INTO语句,用于复制行和自动递增非标识键ID列

给定一个包含三列的表

  1. ID(主键,非自动增量)
  2. 组ID
  3. someValue中

我正在尝试编写单个SQL INSERT INTO语句,该语句将具有一个GroupID的每一行的副本复制到新的GroupID中.

示例开始表:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
Run Code Online (Sandbox Code Playgroud)

我运行一个简单的INSERT INTO语句后的目标:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
3  |    2    |    a
4  |    2    |    b
Run Code Online (Sandbox Code Playgroud)

我以为我可以这样做:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 WHERE ID = @OriginalGroupID
)
Run Code Online (Sandbox Code Playgroud)

这会导致PrimaryKey违规,因为它最终会多次重复使用相同的Max(ID)+1值.

我是否只能在T-SQL …

sql t-sql

9
推荐指数
1
解决办法
1万
查看次数

SQL的EXISTS和NOT EXISTS的目的

偶尔我会看到这些被使用,但它似乎永远不会通过使用普通的连接或子查询来做同样好的事情,如果不是更好的话.

我认为它们具有误导性(与常规连接和子查询相比,它们可能更难以准确地显示),经常被误解(例如使用SELECT *SELECT 1EXISTS/NOT EXISTS子查询中的行为相同),并且从我有限的经验来看,执行速度较慢.

有人可以描述和/或提供一个他们最适合的例子,或除了使用它们之外别无选择的例子吗?请注意,由于它们的执行和性能可能取决于平台,因此我对它们在MySQL中的使用特别感兴趣.

mysql sql exists subquery not-exists

8
推荐指数
1
解决办法
1857
查看次数

T-SQL相当于oracle sql where子句有多个列

让我们来看看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)

sql t-sql sql-server oracle row-value-expression

5
推荐指数
2
解决办法
1602
查看次数