小编Tho*_*ner的帖子

插入查询

在查看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决定允许插入查询,因为它们允许插入视图,还有什么是子查询,然后是临时视图?因此,当你可以插入到一个视图中时,他们肯定会让你插入到一个特殊的视图中,但是正确的心灵中的任何人都不会使用这种语法,当然:-)

但也许我错了?也许这种语法确实提供了一些我还没有意识到的东西?如果是这样告诉我:-)

sql oracle insert

7
推荐指数
2
解决办法
692
查看次数

如何组合连续的数字范围

我正在寻找一种在单个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)

sql oracle

5
推荐指数
1
解决办法
1256
查看次数

从oracle中的日期提取月份和年份

从完整日期开始提取月份和年份的查询是什么.我的数据是这样的: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

sql oracle

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

如何优化此 LIKE JOIN 查询?

此查询查找域的后缀:

        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可视化计划。我已经尝试向表中添加覆盖索引,但它们最终没有被查询规划器使用。也许还有另一个查询可能更有效?

sql postgresql postgresql-9.5

5
推荐指数
1
解决办法
132
查看次数

HashSet限制 - 如何进行?

我的程序创建自定义对象,我想获得一个独特的列表.所以我想使用一个集合并按对象添加对象.该集将防止重复.最后我有一组独特的对象.

我通常会使用HashSet,因为我不需要排序集.只有,有很多不同的潜在对象.超过2 ^ 32.GetHashCode函数返回一个int,因此这不能作为我的对象的唯一键.

我假设我不能使用HashSet,因此必须使用较慢的SortedSet并让我的对象实现IComparable/CompareTo.它是否正确?或者有一种方法来使用具有长哈希码的HashSet吗?

.net c# set hashset gethashcode

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

Oracle 获取最近 10 天的 sql

我需要从现在开始获取最后 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)

sql oracle

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

第二个查询中的 UNION 表基于 Oracle sql 中第一个查询的结果

我正在努力解决以下问题(进一步提供伪代码以使我的示例更容易理解)

\n

假设我有 2 个查询,我想将其结果联合起来

\n

query1 输出如下:

\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 …

sql oracle union

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

哪个表应该是父表,哪个应该是子表?

你有两张桌子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)

请解释一下哪个表应该是父表,为什么?

database database-design

2
推荐指数
1
解决办法
132
查看次数

我想将一个表中的行分发到其他表中的行,这些行可以在SQL oracle中使用相同的行数

我正在尝试编写一个SQL查询,该记录将记录从一个表分发到另一个表,该表采用相同的数字.

在这个例子中,我有两个表,Students并且Teachers,我想将学生分配给每个教师.

学生:(亚当,班纳特,埃尔默,贾斯汀,路易斯,诺亚,杰克)

老师:( Leo,Kyle,Ethan)

注意:

  1. 一个学生不能有一个以上的老师
  2. 每个老师应该和其他老师一样有相同数量的学生......
  3. ......除非学生人数不是教师人数的精确倍数,否则学生必须尽可能在教师之间平均分配

例如,如果我们有七名学生和三名教师,前两名教师将招收两名学生,最后一名将招收三名学生.

结果:

Student | Teacher
--------+--------
Adam    | Leo
Bennet  | Leo
Elmer   | Kyle
Justin  | Kyle
Louis   | Ethan
Noah    | Ethan
Jack    | Ethan
Run Code Online (Sandbox Code Playgroud)

我怎么能在Oracle SQL中做到这一点?

sql oracle plsql

2
推荐指数
1
解决办法
111
查看次数

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 right-join

2
推荐指数
1
解决办法
53
查看次数