gpt4 book ai didi

mysql - 数据查询(通过外键连接)

转载 作者:行者123 更新时间:2023-11-29 21:53:21 25 4
gpt4 key购买 nike

我想要进行良好的 SQL 查询,但需要一些帮助...

表A

1 "aaa" "STATUS_OK"
2 "bbb" "STATUS_OK"
3 "ccc" "STATUS_OK"
4 "ddd" "STATUS_NOT_OK"

表B

1 "Addtional Data1" 1/9/2015 2 (foregin Key = TableA.ID)
2 "Addtional Data2" 2/9/2015 2 (foregin Key = TableA.ID)
3 "Addtional Data3" 3/9/2015 2 (foregin Key = TableA.ID)
4 "Addtional Data4" 4/9/2015 2 (foregin Key = TableA.ID)

因此表 A 的 2 个“bbb”实体在表 B 中有 4 个附加数据

这里我想从表 A 中提取行

  1. 状态为“STATUS_OK”
  2. 过去 2 周内没有其他数据

我想了一天。我熟悉基本的 SQL 语法,但这让我很困难。

有人可以帮我进行这个查询吗?

我可以通过在表 A 中添加“更新时间”来解决问题,但这个解决方案并不是那么可取......

<小时/>

如果我用简单的 SQL 来实现这种情况,

CREATE TABLE table_A(
ID int NOT NULL,
NAME VARCHAR(20),
STATUS VARCHAR(20),
PRIMARY KEY(ID)
);

CREATE TABLE table_B(
ID int NOT NULL,
DATA VARCHAR(20),
CREATEDATE DATE,
A_ID int,
PRIMARY KEY(ID),
FOREIGN KEY (A_ID) REFERENCES table_A(ID)
);

最佳答案

一种选择是使用 NOT EXISTS 来执行此操作:

SELECT  ID,NAME,[STATUS]
FROM table_A a
WHERE a.[STATUS] = 'STATUS_OK'
AND NOT EXISTS
(SELECT TOP 1 1
FROM table_B b
WHERE b.A_ID = a.ID
AND DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2)

编辑:这是使用LEFT JOIN的另一个版本:

SELECT  a.ID, a.NAME, a.[STATUS]
FROM table_A a
LEFT JOIN table_B b ON a.ID = b.A_ID
AND DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2
WHERE a.[STATUS] = 'STATUS_OK'
AND b.A_ID IS NULL

编辑2:使用子查询也可以。在小型表上,这 3 个查询没有区别。如果您针对数百万条记录运行它,您必须检查哪一个最适合您:

SELECT  ID,NAME,[STATUS]
FROM table_A a
WHERE a.[STATUS] = 'STATUS_OK'
AND a.ID NOT IN
(SELECT b.A_ID
FROM table_B b
WHERE DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2)

关于mysql - 数据查询(通过外键连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33407759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com