Sql “保证”工作对我来说并不清楚

Sql “保证”工作对我来说并不清楚,sql,join,sqlite,sql-order-by,Sql,Join,Sqlite,Sql Order By,当然,如果SQLite对UNION ALL语句的顺序没有提供任何保证(也就是说,如果问题基于错误的假设),那么看到一个有充分根据的重新表述将是很有趣的。谢谢。由于n和s字段不是唯一的,如果同一个值出现不止一次怎么办?很好,在这种情况下,我假设s和n值出现得更正确?检查这把小提琴这是你需要的结果集吗?不,唯一的保证是两个表具有相同的行数。此示例返回3行而不是4行:如果您方便将输入列表转换为逗号分隔的列表,此提琴将帮助您实现所需的结果集:我也添加了此解决方案来回答。您的意思是“表是有序的”吗?你有什

当然,如果SQLite对
UNION ALL
语句的顺序没有提供任何保证(也就是说,如果问题基于错误的假设),那么看到一个有充分根据的重新表述将是很有趣的。

谢谢。由于
n
s
字段不是唯一的,如果同一个值出现不止一次怎么办?很好,在这种情况下,我假设s和n值出现得更正确?检查这把小提琴这是你需要的结果集吗?不,唯一的保证是两个表具有相同的行数。此示例返回3行而不是4行:如果您方便将输入列表转换为逗号分隔的列表,此提琴将帮助您实现所需的结果集:我也添加了此解决方案来回答。您的意思是“表是有序的”吗?你有什么理由认为你的意思就是问题的意思?“既然表是有序的,您可以…”中的“因为”总结了什么理由?它可以工作,但在这种情况下,它不再是一个单独的语句。如果列
o
不是唯一的(它仍然是有效的顺序),并且相同的元素出现在多个元素中,这个方法失败了:我试图在表中有重复的情况下引入一个随机列,但是我得到了一个奇怪的结果,结果是空值:每次执行查询时,结果都不同。我认为
RANDOM()
在SQLite的CTE中使用时的行为与您可能期望的不一样-当连接表时,它似乎会被重新评估。为了证明这一点,请查看
的结果,从表中选择a1.r,b1.r交叉连接表\u ar a1交叉连接表\u br b1
-期望其中一些值相同,但它们都不同。@philipxy我从上面的理解是,Iter Ator希望连接的行尽可能遵循排序列的顺序。但是,如果排序列有一组重复项,则联接仍应与另一个表一一对应,但从该组中随机选取行。@迭代器Re:奇怪的
random()
行为,我做了一些进一步的调查,并在这里提出了一个新问题:。Re:“结果是有序的,但没有一列是唯一的。“-不确定您是否已经知道所有这些,但在SQL中,如果明确定义了no
orderby
,则不定义行返回的顺序。如果指定了顺序,但不同行之间的值相同,则不定义这些行返回的顺序。因此,考虑到这一点,两个表的连接方式是不可预测/确定的。(我对上述评论的看法:)什么是“表是有序的”?表格未排序,结果集[sic]未排序。没有“保持”的命令。即使有实现顺序,也无法通过查询访问。请澄清。当心,你似乎有一些误解。(例如re random(),不保证对给定参数的每个查询调用运算符超过一次。)
WITH
table_a (n) AS (
  SELECT 2
  UNION ALL
  SELECT 4
  UNION ALL
  SELECT 5
),
table_b (s) AS (
  SELECT 'valuex'
  UNION ALL
  SELECT 'valuey'
  UNION ALL
  SELECT 'valuez'
)
SELECT table_a.n, table_b.s
FROM table_a
LEFT JOIN table_b ON ( table_a.rowid = table_b.rowid )
(2, 'valuex'),
(4, 'valuey'),
(5, 'valuez')
WITH
v_table_a (n, rowid) AS (
  SELECT 2, 1
  UNION ALL
  SELECT 4, 2
  UNION ALL
  SELECT 5, 3
),
v_table_b (s, rowid) AS (
  SELECT 'valuex', 1
  UNION ALL
  SELECT 'valuey', 2
  UNION ALL
  SELECT 'valuez', 3
)
SELECT v_table_a.n, v_table_b.s
FROM v_table_a
LEFT JOIN v_table_b ON ( v_table_a.rowid = v_table_b.rowid );
WITH RECURSIVE vr_table_a (n, rowid) AS (
  VALUES (2, 1)
  UNION ALL
  SELECT n + 2, rowid + 1 FROM vr_table_a WHERE rowid < 3
)
, vr_table_b (s, rowid) AS (
  VALUES ('I', 1)
  UNION ALL
  SELECT s || 'I', rowid + 1 FROM vr_table_b WHERE rowid < 3
)
SELECT vr_table_a.n, vr_table_b.s
FROM vr_table_a
LEFT JOIN vr_table_b ON ( vr_table_a.rowid = vr_table_b.rowid );
CREATE TABLE p_table_a (n INT);
INSERT INTO p_table_a VALUES (2), (4), (5);
CREATE TABLE p_table_b (s VARCHAR(6));
INSERT INTO p_table_b VALUES ('valuex'), ('valuey'), ('valuez');

SELECT p_table_a.n, p_table_b.s
FROM p_table_a
LEFT JOIN p_table_b ON ( p_table_a.rowid = p_table_b.rowid );
WITH
table_a_a (n, id) AS 
(
  WITH table_a (n) AS 
  (
  SELECT 2
  UNION ALL
  SELECT 4
  UNION ALL
  SELECT 5
  )
SELECT table_a.n, (select count(1) from table_a b where b.n <= table_a.n) id
FROM table_a
) ,
table_b_b (n, id) AS 
(
  WITH table_a (n) AS 
  (
   SELECT 'valuex'
  UNION ALL
  SELECT 'valuey'
  UNION ALL
  SELECT 'valuez'
  )
SELECT table_a.n, (select count(1) from table_a b where b.n <= table_a.n) id
FROM table_a
) 
select table_a_a.n,table_b_b.n  from table_a_a,table_b_b where table_a_a.ID = table_b_b.ID
WITH RECURSIVE  table_b( id,element, remainder ) AS (
            SELECT 0,NULL AS element, 'valuex,valuey,valuz,valuz' AS remainder
                UNION ALL
            SELECT id+1,
                CASE
                    WHEN INSTR( remainder, ',' )>0 THEN 
                        SUBSTR( remainder, 0, INSTR( remainder, ',' ) )
                    ELSE
                        remainder
                END AS element,
                CASE
                    WHEN INSTR( remainder, ',' )>0 THEN 
                        SUBSTR( remainder, INSTR( remainder, ',' )+1 )
                    ELSE
                        NULL
                END AS remainder
            FROM table_b
            WHERE remainder IS NOT NULL
        ),
          table_a( id,element, remainder ) AS (
            SELECT 0,NULL AS element, '2,4,5,7' AS remainder
                UNION ALL
            SELECT id+1,
                CASE
                    WHEN INSTR( remainder, ',' )>0 THEN 
                        SUBSTR( remainder, 0, INSTR( remainder, ',' ) )
                    ELSE
                        remainder
                END AS element,
                CASE
                    WHEN INSTR( remainder, ',' )>0 THEN 
                        SUBSTR( remainder, INSTR( remainder, ',' )+1 )
                    ELSE
                        NULL
                END AS remainder
            FROM table_a
            WHERE remainder IS NOT NULL
        )
         SELECT table_b.element, table_a.element FROM table_b, table_a WHERE table_a.element IS NOT NULL and table_a.id = table_b.id;
CREATE TEMP TABLE temp_a(n integer);
CREATE TEMP TABLE temp_b(n VARCHAR(255));

WITH table_a(n) AS (
  SELECT 2 n
  UNION ALL
  SELECT 4
  UNION ALL
  SELECT 5
  UNION ALL
  SELECT 5
) 
INSERT INTO temp_a (n) SELECT n FROM table_a;

WITH table_b (n) AS 
(
  SELECT 'valuex'
  UNION ALL
  SELECT 'valuey'
  UNION ALL
  SELECT 'valuez'
  UNION ALL
  SELECT 'valuew'
)
INSERT INTO temp_b (n) SELECT n FROM table_b;

SELECT * 
FROM temp_a a 
INNER JOIN temp_b b on a.rowid = b.rowid;
SELECT a1.n, b1.s
FROM table_a a1
LEFT JOIN table_b b1
ON (SELECT COUNT(*) FROM table_a a2 WHERE a2.n <= a1.n) =
   (SELECT COUNT(*) FROM table_b b2 WHERE b2.s <= b1.s)
with tablea AS (
  select id, rowid AS rid from someids),
  tableb AS (
  select details, rowid AS rid from somedetails)
select tablea.id, tableb.details
from
    tablea
    left join tableb on tablea.rid = tableb.rid;
WITH table_a (n) AS (
      SELECT 2 UNION ALL
      SELECT 4 UNION ALL
      SELECT 4 UNION ALL
      SELECT 4 UNION ALL
      SELECT 5
     ),
     table_b (s) AS (
      SELECT 'valuex' UNION ALL
      SELECT 'valuey' UNION ALL
      SELECT 'valuey' UNION ALL
      SELECT 'valuez' UNION ALL
      SELECT 'valuez'
     ),
     a as (
      select a.n, count(*) as a_cnt,
             (select count(*) from table_a a2 where a2.n < a.n) as a_offset
      from table_a a
      group by a.n
     ),
     b as (
      select b.s, count(*) as  b_cnt,
             (select count(*) from table_b b2 where b2.s < b.s) as b_offset
      from table_b b
      group by b.s
     ),
     ab as (
      select a.*, b.*,
             max(a.a_offset, b.b_offset) as offset,
             min(a.a_offset + a.a_cnt, b.b_offset + b.b_cnt) - max(a.a_offset, b.b_offset) as cnt
      from a join
           b
           on a.a_offset + a.a_cnt - 1 >= b.b_offset and
              a.a_offset <= b.b_offset + b.b_cnt - 1
     ),
      cte as (
      select n, s, offset, cnt, 1 as ind
      from ab
      union all
      select n, s, offset, cnt, ind + 1
      from cte
      where ind < cnt
     )
select n, s
from cte
order by n, s;
with tablea AS (select id, rowid AS rid from someids),
  tableb AS (select details, rowid AS rid from somedetails)
select tablea.id, tableb.details
from
    tablea
    left join tableb on tablea.rid = tableb.rid;
A(rid,n) AS (SELECT ROW_NUMBER() OVER ( ORDER BY 1 ) rid, n FROM table_a),
B(rid,s) AS (SELECT ROW_NUMBER() OVER ( ORDER BY 1 ) rid, s FROM table_b)
WITH
table_a (n) AS (
  SELECT 2
  UNION ALL
  SELECT 4
  UNION ALL
  SELECT 5
),
table_b (s) AS (
  SELECT 'valuex'
  UNION ALL
  SELECT 'valuey'
  UNION ALL
  SELECT 'valuez'
),
A(rid,n) AS (SELECT ROW_NUMBER() OVER ( ORDER BY 1 ) rid, n FROM table_a),
B(rid,s) AS (SELECT ROW_NUMBER() OVER ( ORDER BY 1 ) rid, s FROM table_b)

SELECT A.n, B.s
FROM A LEFT JOIN B
ON ( A.rid = B.rid );