在查看Oracle的INSERT语法时,我注意到您可以插入查询,例如
insert into (select * from dept) (deptno, dname) values (99, 'new department');
Run Code Online (Sandbox Code Playgroud)
任何人都可以了解这是什么意思吗?插入到我不能直接插入表中的查询中可以实现什么?
更新:到目前为止,这似乎只是一种替代语法,所以我可以写
insert into (select deptno, dname from dept) values (99, 'new department');
Run Code Online (Sandbox Code Playgroud)
代替
insert into dept (deptno, dname) values (99, 'new department');
Run Code Online (Sandbox Code Playgroud)
同样的事情,相同的执行计划.查询是否返回记录无关紧要.这个:
insert into (select deptno, dname from dept where 1 = 0) values (99, 'new department');
Run Code Online (Sandbox Code Playgroud)
再次导致相同的执行计划.因此,只要我们只选择一个表中的列,我们就可以假设子查询的内容并不重要.但不是.这个:
insert into (select deptno, dname from dept cross join some_table)
values (99, 'new department');
Run Code Online (Sandbox Code Playgroud)
导致"ORA-01779:无法修改映射到非密钥保留表的列"或"ORA-01732:数据操作操作在此视图上不合法".
我的印象是Oracle决定允许插入查询,因为它们允许插入视图,还有什么是子查询,然后是临时视图?因此,当你可以插入到一个视图中时,他们肯定会让你插入到一个特殊的视图中,但是正确的心灵中的任何人都不会使用这种语法,当然:-)
但也许我错了?也许这种语法确实提供了一些我还没有意识到的东西?如果是这样告诉我:-)
我正在寻找一种在单个select语句中组合连续数字范围的简洁方法.
说我的表有这些记录:
first_number last_number
0 9
10 19
20 29
40 49
50 59
70 79
Run Code Online (Sandbox Code Playgroud)
然后输出如下:
first_number last_number
0 29
40 59
70 79
Run Code Online (Sandbox Code Playgroud)
这就是我想出来的:
select first_number, last_number_of_range
from
(
select
first_number, is_continuing, is_continued,
nvl(lead (last_number,1,null) over (order by first_number), last_number) as last_number_of_range
from
(
select *
from
(
select first_number, last_number,
case when lag (last_number,1,null) over (order by first_number) + 1 = first_number then 1 else 0 end as is_continuing,
case when lead (first_number,1,null) over (order by last_number) …
Run Code Online (Sandbox Code Playgroud) 从完整日期开始提取月份和年份的查询是什么.我的数据是这样的:1/29/2008我试过这个查询:
select ID_NO, CHECKED_DATE, to_date(TO_CHAR(CHECKED_DATE, 'MON-YYYY'), 'MON-YYYY') AS A
from Doctor_Checkup;
Run Code Online (Sandbox Code Playgroud)
但它会给出输出:1/1/2008
预期产量:1-2008
此查询查找域的后缀:
SELECT
DISTINCT ON ("companyDomain".id)
"companyDomain".domain,
"publicSuffix".suffix
FROM
"companyDomain"
INNER JOIN
"publicSuffix"
ON
REVERSE("companyDomain".domain) LIKE REVERSE("publicSuffix".suffix) || '%'
ORDER BY
"companyDomain".id, LENGTH("publicSuffix".suffix) DESC
Run Code Online (Sandbox Code Playgroud)
编辑:注意这也适用于子域。
您可以摆弄此处的示例并使用pev可视化计划。我已经尝试向表中添加覆盖索引,但它们最终没有被查询规划器使用。也许还有另一个查询可能更有效?
我的程序创建自定义对象,我想获得一个独特的列表.所以我想使用一个集合并按对象添加对象.该集将防止重复.最后我有一组独特的对象.
我通常会使用HashSet,因为我不需要排序集.只有,有很多不同的潜在对象.超过2 ^ 32.GetHashCode函数返回一个int,因此这不能作为我的对象的唯一键.
我假设我不能使用HashSet,因此必须使用较慢的SortedSet并让我的对象实现IComparable/CompareTo.它是否正确?或者有一种方法来使用具有长哈希码的HashSet吗?
我需要从现在开始获取最后 10 天,我目前有以下 Oracle sql 查询来获取最后 10 个日期。
WITH DATES AS (
SELECT sysdate - 10 AS value_date FROM dual
UNION
SELECT sysdate - 9 AS value_date FROM dual
UNION
SELECT sysdate - 8 AS value_date FROM dual
UNION
SELECT sysdate - 7 AS value_date FROM dual
UNION
SELECT sysdate - 6 AS value_date FROM dual
UNION
SELECT sysdate - 5 AS value_date FROM dual
UNION
SELECT sysdate - 4 AS value_date FROM dual
UNION
SELECT sysdate - 3 AS …
Run Code Online (Sandbox Code Playgroud) 我正在努力解决以下问题(进一步提供伪代码以使我的示例更容易理解)
\n假设我有 2 个查询,我想将其结果联合起来
\nquery1 输出如下:
\n\nID 报价\n1 prod_1\n2 prod_2\n3 prod_2\n4 prod_1\n\n
query2 输出如下:
\n\nID 段\n1 低\n2 高\n3 中\n999 中\n\n
我需要做的是合并这两个查询的结果,但避免获取 ID = 999 的行
\n是否有任何方法可以通过根据 query2 的列 ID 中存在的列 ID 的值从 query2 中提取行来使用 UNION 来执行此操作?
\n我知道下面的代码是不正确的,但它很大程度上传达了 \xe2\x80\x8b\xe2\x80\x8b 这个问题的想法:
\n--query1\n(\n SELECT ID, OFFER\n FROM TAB1\n WHERE ID <= 4\n) RES1\nUNION\n--query2\nSELECT ID, SEGMENT\nFROM TAB1\nWHERE ID IN (SELECT ID FROM RES2)\n
Run Code Online (Sandbox Code Playgroud)\n结果应如下
\n\nID 报价\n1 prod_1\n2 prod_2\n3 prod_2\n4 prod_1\n1 低\n2 高\n3 中\n …
你有两张桌子Auther和Books.我很困惑,我应该保留哪个表作为父表,哪个应该是用于制作外键约束的子表.
CREATE TABLE author
(
author_id NUMBER(3) CONSTRAINT athr_aid_pk PRIMARY KEY,
author_name VARCHAR2(30)
);
CREATE TABLE books
(
book_id NUMBER(3),
book_title VARCHAR2(30),
book_price NUMBER(3),
);
Run Code Online (Sandbox Code Playgroud)
请解释一下哪个表应该是父表,为什么?
我正在尝试编写一个SQL查询,该记录将记录从一个表分发到另一个表,该表采用相同的数字.
在这个例子中,我有两个表,Students
并且Teachers
,我想将学生分配给每个教师.
学生:(亚当,班纳特,埃尔默,贾斯汀,路易斯,诺亚,杰克)
老师:( Leo,Kyle,Ethan)
注意:
例如,如果我们有七名学生和三名教师,前两名教师将招收两名学生,最后一名将招收三名学生.
结果:
Student | Teacher
--------+--------
Adam | Leo
Bennet | Leo
Elmer | Kyle
Justin | Kyle
Louis | Ethan
Noah | Ethan
Jack | Ethan
Run Code Online (Sandbox Code Playgroud)
我怎么能在Oracle SQL中做到这一点?
我有一张看起来像这样的表:
+-----------+--------+------------+ | member_id | 姓名 | 合作伙伴_id | +-----------+--------+------------+ | 1 | 约翰 | 2 | | 2 | 伊娃 | 1 | | 3 | 彼得 | 4 | | 4 | 米娅 | 3 | | 5 | 瑞秋 | 空| +-----------+--------+------------+
我想显示成员名称及其合作伙伴的名称。我还需要显示没有成员的成员。但是,这就是我使用 RIGTH JOIN 时得到的结果:
SELECT m1.name, m2.name
FROM members m1
RIGHT JOIN members m2 ON m1.member_id=m2.partner_id
Run Code Online (Sandbox Code Playgroud)
+--------+--------------+ | 姓名 | 合作伙伴姓名 | +--------+--------------+ | 约翰 | 伊娃 | | 伊娃 | 约翰 | | 彼得 …
sql ×8
oracle ×6
.net ×1
c# ×1
database ×1
gethashcode ×1
hashset ×1
insert ×1
plsql ×1
postgresql ×1
right-join ×1
set ×1
union ×1