我有一个包含字段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 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 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 …
偶尔我会看到这些被使用,但它似乎永远不会通过使用普通的连接或子查询来做同样好的事情,如果不是更好的话.
我认为它们具有误导性(与常规连接和子查询相比,它们可能更难以准确地显示),经常被误解(例如使用SELECT *将SELECT 1与EXISTS/NOT EXISTS子查询中的行为相同),并且从我有限的经验来看,执行速度较慢.
有人可以描述和/或提供一个他们最适合的例子,或除了使用它们之外别无选择的例子吗?请注意,由于它们的执行和性能可能取决于平台,因此我对它们在MySQL中的使用特别感兴趣.
让我们来看看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 ×5
sql-server ×2
t-sql ×2
exists ×1
join ×1
mysql ×1
not-exists ×1
oracle ×1
performance ×1
subquery ×1
tuples ×1