AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[join](dba)

Martin Hope
Erich4792
Asked: 2024-07-12 05:07:47 +0800 CST

SQLite 连接 2 个表,其中表 1 有两列引用表 2

  • 6

我有两张桌子:

工作

CREATE TABLE IF NOT EXISTS jobs (
    job_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    job_name TEXT,
    prime_desc INTEGER NOT NULL REFERENCES descriptions(desc_id),
    scnd_desc INTEGER NOT NULL REFERENCES descriptions(desc_id),
);

INSERT INTO jobs (job_name, prime_desc, scnd_desc) VALUES ('Soldier', 1, 5);
INSERT INTO jobs (job_name, prime_desc, scnd_desc) VALUES ('Pastor', 2, 3);
INSERT INTO jobs (job_name, prime_desc, scnd_desc) VALUES ('Firefighter', 5, 4);

描述

CREATE TABLE IF NOT EXISTS descriptions (
    desc_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    desc_name TEXT,
);

INSERT INTO descriptions (desc_name) VALUES ('Strong');
INSERT INTO descriptions (desc_name) VALUES ('Pious');
INSERT INTO descriptions (desc_name) VALUES ('Honest');
INSERT INTO descriptions (desc_name) VALUES ('Agile');
INSERT INTO descriptions (desc_name) VALUES ('Brave');

在此示例中,我希望能够为一份工作添加两个描述。代码运行正常,我可以对其进行查询:

SELECT * FROM jobs;

这将返回预期的结果:

1|Soldier|1|5
2|Pastor|2|3
3|Firefighter|5|4

我一直在尝试做的是获取一个列出作业名称以及主要和次要描述名称的查询:

Firefighter|Brave|Agile

我还没能得到那个结果。

我努力了:

SELECT
    jobs.job_name,
    desc.desc_name
FROM
    jobs
JOIN
    descriptions ON jobs.prime_desc = descriptions.desc_id
JOIN
    descriptions ON jobs.scnd_desc = descriptions.desc_id;

这将返回一个错误:

Parse error: ambiguous column name: descriptions.desc_name
  SELECT jobs.job_name, descriptions.desc_name FROM jobs JOIN descriptions ON...
          error here ---^

我在互联网上搜索了该错误,但没有找到任何我想要完成的示例。

我尝试了许多不同的组合:

RIGHT JOIN, LEFT JOIN, UNION, UNION ALL, ALIAS

在多种配置中。我最接近的是使用 UNION,但它没有按预期输出结果;这是我尝试过的 UNION:

SELECT
    jobs.job_name, descriptions.desc_name
FROM
    jobs
JOIN
    descriptions ON jobs.prime_desc = descriptions.desc_id
UNION
SELECT
    jobs.job_name, descriptions.desc_name
FROM
    jobs
JOIN
    descriptions ON jobs.scnd_desc = descriptions.desc_id;

返回:

Soldier|Strong
Pastor|Pious
Firefighter|Brave
Soldier|Brave
Pastor|Honest
Firefighter|Agile

它按要求返回结果,所以我知道我做错了。我只是不知道我做了什么,导致无法将结果打印在每项作业的一行中,如上面的 Firefighter 示例所示。

我尝试过创建列别名、表别名等。我不知道该如何处理。如能得到任何帮助,我将不胜感激。

join
  • 2 个回答
  • 19 Views
Martin Hope
av4625
Asked: 2024-02-01 07:59:00 +0800 CST

如何使用 SQLite 仅从带有外键的表中获取数据?

  • 6

我希望能够从拥有外键作为主键的表中获取数据,仅使用WHERE其他表中的子句中的数据。

我尝试过内部连接,但得到了奇怪的结果。我正在使用https://sqliteonline.com来测试这一点。

我有两张表,一张名为cars“具有名称和 ID”的表。一个被调用的logged_data具有 ID、轨道和汽车 ID 的外键,使用car.id.

我想获取在特定赛道上记录数据的所有(不同的)汽车名称。

这些是我尝试过的陈述:

CREATE TABLE cars (id INTEGER PRIMARY KEY NOT NULL, name TEXT UNIQUE NOT NULL DEFAULT 'Car1');
INSERT INTO cars DEFAULT VALUES;
INSERT OR IGNORE INTO cars (name) VALUES ("BMW");
INSERT OR IGNORE INTO cars (name) VALUES ("test");
CREATE TABLE logged_data (id INTEGER PRIMARY KEY NOT NULL, track TEXT NOT NULL, car_id INTEGER NOT NULL, FOREIGN KEY(car_id) REFERENCES cars(id) ON DELETE CASCADE);
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "Car1"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "Car1"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "BMW"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "BMW"));
INSERT INTO logged_data (track, car_id) VALUES ("track1", (SELECT id FROM cars WHERE name = "test"));
INSERT INTO logged_data (track, car_id) VALUES ("track1", (SELECT id FROM cars WHERE name = "test"));
SELECT DISTINCT name FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track";

这将返回:

Car1
BMW
test

test不应返回,因为它尚未在 处获取记录的数据track。

我尝试选择所有内容来查看连接表的样子:

SELECT * FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track";

在此输入图像描述

这只是返回所有曲目的所有数据,即使我只要求track.

但奇怪的是,如果我得到的数据记录在不同的汽车名称中track1。它正确地只返回test. 这是我想要的正确方法吗?为什么我会看到这种不同的行为?

SELECT DISTINCT name FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track1";

这将返回:

test
join
  • 1 个回答
  • 12 Views
Martin Hope
Coo
Asked: 2024-01-25 23:36:23 +0800 CST

尝试在 time=0 处水平复制 column= attribute1,即使在每个唯一 ID 的 time!=0 的行上也是如此

  • 5

给定一个这样的表,

在此输入图像描述

我想通过 SQL 创建一个表而不执行窗口函数

id | time| attribute1| attribute1atFirstRecordedTimeperID

1  | 0 | a  | a

1 | 2 | b | a

2| 0 | c | c

2| 4 | d | c

我试过

SELECT 
    t1.id, 
    t1.time, 
    t1.attribute1,
    attribute1fixedattime0 = t2.attribute1
FROM s t1
INNER JOIN (
    SELECT attribute1 AS attribute1fixedattime0
    FROM s
    WHERE time = 0
) t2 ON t1.id = t2.id

列别名是否正确?

这会引发错误在此输入图像描述

如果我修复此代码,我想让 SQL 代码适用于 id=2 没有在时间 t=0 记录其第一个 attribute1 的情况,但适用于 t>0。那么我是在连接条件上还是在连接内部做一分钟的操作呢?

我想通过 SQL 创建一个表,而不需要执行窗口函数来转

进入

去从

编号 | 时间| 属性1

1  | 0 | a 

1 | 2 | b 

2| 42 | c 

2| 69 | d 

到餐桌上

id | time| attribute1| attribute1atFirstRecordedTimeperID

1  | 0 | a  | a

1 | 2 | b | a

2| 42 | c | c

2| 69 | d | c

如果你使用 row_number() 窗口函数来标记每个 id 中第一次出现的位置,那么你如何加入或者你不会使用加入而是使用其他东西?

SELECT 
    id,
    time,
    attribute1,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY time) AS rn
FROM your_table

SELECT
    id,
    time,
    attribute1,
    FIRST_VALUE(attribute1) OVER (PARTITION BY id ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS attribute1atFirstRecordedTimeperID
FROM (
    -- Previous query here
) AS subquery
join
  • 1 个回答
  • 19 Views
Martin Hope
user45867
Asked: 2023-11-14 23:28:53 +0800 CST

SQL 模式获取不均匀层次结构数据集的“根/开始”

  • 5

我觉得这是一个常见问题,我什至在一些 SQL 挑战中也看到过它,但就我的一生而言,无法清楚地思考解决方案。

假设你的层次结构不均匀。属于其他元素但您不知道顶部的元素。

为了保持简单,我们假设这是一个公司组织结构图(实际上它是任务依赖关系,但是呃)。

所以就有了一张桌子。员工姓名和老板姓名。

Employee name: Bob .... Boss Name: Dora
Employee name Dora .... Boss Name: Kim

不断地。就我而言,还有一条附加信息。一个人只能向一个人汇报。一对一的关系。

链顶部有 N 个元素,其名称为:Whoever Boss:Null。

所以我正在做如下事情:

select employee_name, boss_name
from boss_table b1
left join boss_table b2 on b1.boss_name = b2.employee_name
left join boss_table b3 on b2.boss_name = b3.employee_name

不断地尝试找到每个员工的“根本老板”或“最高老板”。然而,其中一些嵌套元素非常深——我不想进行 20 个连接……或者至少把它们写出来——我觉得递归函数是显而易见的答案,但无法弄清楚——想法?

join
  • 1 个回答
  • 29 Views
Martin Hope
Gary Czychi
Asked: 2023-09-14 20:53:46 +0800 CST

UPDATE & SELECT & INNER JOIN 组合 (SQL92) — 如何?

  • 5

我有两个带有以下列的表:

Table1
id 
Sort
dou

和

Table2
id_Table1
Sort

我需要读取 Table1.Sort 中 Table1.dou = 1 的所有值并将它们写入 Table2.Sort 中 Table2.id_Table1 与 Table1.id 值匹配的那些行。

我可以:SELECT Sort FROM Table1 WHERE dou = 1

我能做到UPDATE Table2 SET Sort WHERE id_Table1 = 'uuid'

但是,如何以所有 Table1.Sort 值覆盖 Table2.Sort 值的方式组合这些值?

在我的 SQL92 版本中,我可以使用INNER JOIN语句,但我不知道它与标准的遵守程度如何。我不知道这可以与UPDATE声明一起使用。

我正在使用 FileMaker SQL 引擎。

join
  • 1 个回答
  • 37 Views
Martin Hope
Stam Kapetanakis
Asked: 2023-05-31 02:29:36 +0800 CST

在相关表中使用 DOB 更新具有年龄计算的行

  • 5

SQLite 数据库,表“events”包含列events.eventDate、events.ageAtEvent和events.foreignKey_participants,表“participants”包含列participants.primaryKey和participants.dob。

我想用每个参与者在事件发生时的当前年龄更新 events.ageAtEvent 中的所有行。

我试过的:

UPDATE events
SET ageAtEvent = (
SELECT (strftime('%Y', events.eventDate) - strftime('%Y', participants.dob)) - (strftime('%m-%d', events.eventDate) < strftime('%m-%d', participants.dob))
FROM events JOIN participants ON events.foreignKey_participants = participants.primaryKey
);

这将使用相同的 ageAtEvent 填充所有行,大概是第一行。我不清楚如何将正确的计算应用于每一行。非常感谢这方面的帮助。

join
  • 1 个回答
  • 19 Views
Martin Hope
dharmatech
Asked: 2023-04-09 03:10:19 +0800 CST

如果为 NULL,则加入并使用最新数据

  • 5

表 WSHOSHO

SELECT * FROM WSHOSHO;

在此处输入图像描述

建议零售价表

SELECT * FROM RRP;

在此处输入图像描述

加入说明问题

这个连接的结果可以用来说明这个问题:

SELECT * FROM WSHOSHO RIGHT JOIN RRP ON (WSHOSHO.DATE = RRP.DATE);

结果:

在此处输入图像描述

IE:

For any given row of RRP
    If there's a `WSHOSHO` row with the same date, use that

    Otherwise, use the most recent WSHOSHO before RRP.DATE

问题

什么是实现此目的的好查询?

示例数据

下面是一些 T-SQL 代码,用于设置此处使用的示例数据。

DROP TABLE WSHOSHO;

DROP TABLE RRP;

IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='WSHOSHO')
    CREATE TABLE WSHOSHO (
        DATE    varchar(255), 
        WSHOSHO decimal
    )

IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='RRP')
    CREATE TABLE RRP (
        DATE    varchar(255), 
        RRP decimal
    )

INSERT INTO WSHOSHO
VALUES 
('2023-01-11', 8100175.0), 
('2023-01-18', 8079010.0), 
('2023-01-25', 8062665.0), 
('2023-02-01', 8024470.0), 
('2023-02-08', 8024104.0), 
('2023-02-15', 7990467.0), 
('2023-02-22', 7986887.0), 
('2023-03-01', 7948534.0), 
('2023-03-08', 7948335.0), 
('2023-03-15', 7940014.0), 
('2023-03-22', 7936558.0), 
('2023-03-29', 7926131.0), 
('2023-04-05', 7877114.0);

INSERT INTO RRP
VALUES
('2023-01-03', 2188272000000), 
('2023-01-04', 2229542000000), 
('2023-01-05', 2242486000000), 
('2023-01-06', 2208265000000), 
('2023-01-09', 2199121000000), 
('2023-01-10', 2192942000000), 
('2023-01-11', 2199170000000), 
('2023-01-12', 2202989000000), 
('2023-01-13', 2179781000000), 
('2023-01-17', 2093328000000), 
('2023-01-18', 2131678000000), 
('2023-01-19', 2110145000000), 
('2023-01-20', 2090523000000), 
('2023-01-23', 2135499000000), 
('2023-01-24', 2048386000000), 
('2023-01-25', 2031561000000), 
('2023-01-26', 2024069000000), 
('2023-01-27', 2003634000000), 
('2023-01-30', 2048714000000), 
('2023-01-31', 2061572000000), 
('2023-02-01', 2038262000000), 
('2023-02-02', 2050063000000), 
('2023-02-03', 2041217000000), 
('2023-02-06', 2072261000000), 
('2023-02-07', 2057958000000), 
('2023-02-08', 2059604000000), 
('2023-02-09', 2058942000000), 
('2023-02-10', 2042893000000), 
('2023-02-13', 2107775000000), 
('2023-02-14', 2076548000000), 
('2023-02-15', 2011998000000), 
('2023-02-16', 2032457000000), 
('2023-02-17', 2059662000000), 
('2023-02-21', 2046064000000), 
('2023-02-22', 2113849000000), 
('2023-02-23', 2147417000000), 
('2023-02-24', 2142141000000), 
('2023-02-27', 2162435000000), 
('2023-02-28', 2188035000000), 
('2023-03-01', 2133950000000), 
('2023-03-02', 2192355000000), 
('2023-03-03', 2186150000000), 
('2023-03-06', 2190793000000), 
('2023-03-07', 2170195000000), 
('2023-03-08', 2193237000000), 
('2023-03-09', 2229623000000), 
('2023-03-10', 2188375000000), 
('2023-03-13', 2126677000000), 
('2023-03-14', 2042579000000), 
('2023-03-15', 2055823000000), 
('2023-03-16', 2066319000000), 
('2023-03-17', 2106166000000), 
('2023-03-20', 2098393000000), 
('2023-03-21', 2194631000000), 
('2023-03-22', 2279608000000), 
('2023-03-23', 2233956000000), 
('2023-03-24', 2218458000000), 
('2023-03-27', 2220131000000), 
('2023-03-28', 2231749000000), 
('2023-03-29', 2264862000000), 
('2023-03-30', 2271531000000), 
('2023-03-31', 2375171000000), 
('2023-04-03', 2221010000000), 
('2023-04-04', 2219375000000), 
('2023-04-05', 2243011000000), 
('2023-04-06', 2173663000000);

上面的代码是在 SQL Server 的 T-SQL 中。但是,我对任何被视为“惯用 SQL”的 SQL 语言解决方案持开放态度。

PowerShell 方法

我有一种方法适用于 PowerShell 中的数据,如下所示。

但是,我想知道惯用的 SQL 会是什么样子。

$wshosho_data = Invoke-RestMethod 'https://fred.stlouisfed.org/graph/fredgraph.csv?id=WSHOSHO' | ConvertFrom-Csv
$rrp_data     = Invoke-RestMethod ('https://markets.newyorkfed.org/api/rp/reverserepo/propositions/search.json?startDate={0}' -f '2022-04-08')
# ----------------------------------------------------------------------
$wshosho_sorted = $wshosho_data             | Sort-Object DATE
$rrp_sorted     = $rrp_data.repo.operations | Sort-Object operationDate
# ----------------------------------------------------------------------
$wshosho_sorted | Select-Object -Last 10 | ft *
$rrp_sorted     | Select-Object -Last 10 | ft operationDate, totalAmtAccepted
# ----------------------------------------------------------------------
$wshosho_dates = $wshosho_sorted | ForEach-Object DATE
$rrp_dates     = $rrp_sorted     | ForEach-Object operationDate
# ----------------------------------------------------------------------
$rrp_earliest     = $rrp_dates     | Sort-Object | Select-Object -First 1
$wshosho_earliest = $wshosho_dates | Sort-Object | Select-Object -First 1

$earliest = $rrp_earliest, $wshosho_earliest | Sort-Object | Select-Object -Last 1
# ----------------------------------------------------------------------
$dates = $rrp_dates + $wshosho_dates | Sort-Object | Select-Object -Unique | Where-Object { $_ -GE $earliest }
# ----------------------------------------------------------------------
$table = foreach ($date in $dates)
{
    $rrp_record     = $rrp_sorted.Where(     { $_.operationDate -le $date }, 'Last' )[0]
    $wshosho_record = $wshosho_sorted.Where( { $_.DATE          -le $date }, 'Last' )[0]

    $rrp_item     = [decimal] $rrp_record.totalAmtAccepted
    $wshosho_item = [decimal] $wshosho_record.WSHOSHO

    [PSCustomObject]@{
        date    = $date
        wshosho = $wshosho_item
        rrp     = $rrp_item
    }
}

在此处输入图像描述

白猫头鹰的方法

这是一种基于下面 White Owl 的回答的方法。

SELECT
RRP.DATE,
(
    CASE WHEN WSHOSHO.DATE IS NULL
        THEN
        (
            SELECT TOP(1) TBL.WSHOSHO FROM WSHOSHO as TBL WHERE TBL.DATE < RRP.DATE ORDER BY TBL.DATE DESC
        )
        ELSE
            WSHOSHO.WSHOSHO
        END
) AS WSHOSHO,
RRP.RRP
FROM RRP LEFT JOIN WSHOSHO ON (WSHOSHO.DATE = RRP.DATE);

在此处输入图像描述

join
  • 2 个回答
  • 33 Views
Martin Hope
Camila326
Asked: 2023-01-22 17:29:54 +0800 CST

在这种情况下,我将如何使用“LEFT JOIN”和“IF NOT EXISTS”?

  • 5

有 2 个主表:drivers并且driver_riders通过外键连接。每天都有一些司机进行单次或多次骑行。

还有一张桌子driver_rewards

driver_rewards
---
  ride_id
  reward_percent
  reward_amount

一个 cron 作业会rides每隔一小时扫描一次,选择status = success游乐设施并将奖励记录插入到driver_rewards. 但 只有那些尚未插入的游乐设施——也就是说,到目前为止还ride_id = ?没有记录。driver_rewards

如何正确创建会选择此类的 SQL 查询rides?我知道LEFT JOIN,NOT EXISTS但是我将如何在这里使用它们?

join
  • 1 个回答
  • 31 Views
Martin Hope
Johntron
Asked: 2023-01-20 00:06:47 +0800 CST

为什么叫“半连接”?

  • 6

如果我的理解是正确的,半连接是一种从一个数据集中选择记录的方法,这些记录在另一组中具有相关(通过公共属性)记录。那么“半”从何而来?

join
  • 1 个回答
  • 39 Views
Martin Hope
Jens
Asked: 2022-10-24 04:51:50 +0800 CST

Delphi-7 (150) 和 LocalSQL - 来自 BORLAND 的旧 BDE 32 位 - 插入错误消息

  • 5

好的,我知道 BORLAND BDE-32Bit 有点复古,但我想使用它,因为我不想在我的小型台式电脑上安装完整的服务器解决方案。

好的。从此错误消息开始:

INSERT INTO "E:\table.dbf" (NAME,SIZE,WEIGHT,AREA,BMP) VALUES ("foo","42","21,"007","");

ExecSQL 语句后的错误信息是:
Invalid use of keyword。
代币:SIZE,WEIGHT,AREA,BMP) 行号:1。

我找不到任何错误,或者 LocalSQL 不支持 INSERT INTO 命令?

join
  • 1 个回答
  • 20 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve