我知道这是一个常见问题,但我找不到为什么这两个简单表的外连接需要这么长时间的问题。
我确保它们都是 myisam,具有相同的字符集。
创建表 `pinventory` ( `article` char(10) 字符集 latin1 NOT NULL, `库存` int(11) 默认为 NULL, `store_id` char(10) 字符集 latin1 默认为 NULL, `status` char(1) 字符集 latin1 默认为 NULL, `what` int(11) 默认为 NULL, 主键(`文章`), 关键“文章”(“文章”) ) 引擎=MyISAM 默认字符集=utf8 -- pinventory 有 59310 行 创建表“产品”( `productid` int(11) NOT NULL 默认 '0', `prodcode` varchar(250) NOT NULL DEFAULT '', `prodname` varchar(250) NOT NULL DEFAULT '', `prodtype`smallint(6) NOT NULL DEFAULT '0', ... 主键(`productid`), 关键“产品代码”(“产品代码”) ) 引擎=MyISAM 默认字符集=utf8 -- 产品有 7978 行 选择产品代码、产品名称、“不在库存中” 来自产品 LEFT OUTER …
我是数据库新手,正在练习基本操作。我已经在我的机器上设置了 mysql、python 和 sqlalchemy(巨大的胜利)。
我已经用部门和员工编写了这个基本架构(我知道,很无聊)。我已经弄清楚如何进行内部联接(下面包含代码,请随意复制),但我似乎无法获得外部联接。
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, Table, Text, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref, sessionmaker
from datetime import datetime
engine = create_engine('sqlite:///:memory:', echo=False)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
class Department(Base):
__tablename__ = 'department'
id = Column(Integer, primary_key=True)
name = Column(String(100))
def __init__(self, id, name):
self.id = id
self.name = name
class Emp(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True) …Run Code Online (Sandbox Code Playgroud) SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
FROM prodtree_element pe
LEFT JOIN prodtree_link pl
ON pe.prodtree_element_id = pl.to_prodtree_node_id
LEFT JOIN line li
ON pe.line_code = li.line_code
INNER JOIN attribute_values av
ON av.attribute_definition_id = #statusCode#
LEFT JOIN attribute_values av2
ON pe.prodtree_element_id = av.prodtree_element_id
WHERE pe.prodtree_element_func_type <> 'WIZARD'
AND pe.prodtree_element_topo_type = 'NODE'
Run Code Online (Sandbox Code Playgroud)
"#statusCode#"是一个静态id,它匹配属性定义表中的id(为了参数,我们假设为22).问题是,查询在任何合理的时间内完成都会遇到很大麻烦.更大的问题是,我有点需要它提前完成,但记录的数量是巨大的,它必须退缩(约30-50,000).我需要来自多个表的数据,这是它开始变慢的地方.这只是我需要的一部分,我还需要一个与当前"prodtree_elment_id"相匹配的整个其他表.
我正在使用ColdFusion,但即使在SQL Server 2005中直接运行查询也会为此查询创建15-30分钟的等待时间(如果它甚至完成).是否有任何可以想象的方法来加快此查询最多花费5分钟或更少?
我正在尝试为我正在编写的存储过程找到使用FULL OUTER JOIN的替代方法.这是场景.
两张大多数不相关的数据表,表示需要发生的事件.事件需要按时间顺序处理,两个表都有一个日期时间列.因此,我需要获取一个表,作为按日期时间排序的所有这些事件的列表(这两个日期时间列需要混合在一起).
一个小问题:有时两个表中的事件是相关的,在这种情况下,无论日期时间如何,表A中的事件都需要先行.因此,如果A有3个事件,而B有3个事件,但A和B之间只有一个相关的对,我想返回5行.如果存在不相关的数据,则会有NULL数据(这没关系,我使用NULL数据检查来确定下一步要做什么,即进程事件A或B等)
目前我看起来像这样:
SELECT
CASE
WHEN A.EventDateTime IS NULL THEN B.EventDateTime
ELSE A.EventDateTime
END AS SortDateTime,
A.EventId,
B.EventId,
FROM A FULL OUTER JOIN B
ON A.RelatedData=B.RelatedData
ORDER BY SortDateTime
Run Code Online (Sandbox Code Playgroud) 我在NHibernate项目中有几个配置使用的一对多映射Sets.
没有做项目,并max_fetch_depth设置为2,NHibernate似乎总是使用外连接而不是内连接.
是否有一个原因?映射结构相当于:
Category
+- Document.Category
+- Document.User
Run Code Online (Sandbox Code Playgroud)
只是简单的一对多设置.
我想知道如何通过编写外连接查询来获得所需的输出(如下所述),其中我外连接的表是声明中其他连接条件的一部分
给定以下数据结构 - 表A是包含一些任意对象的主表 - 表B由A引用,其中A.TYPE_ID = B.ID - 表C定义表A中对象之间的关系,其中C.SOURCE_ID引用A.ID和C.TARGET_ID引用A.ID
这就是架构的定义方式,我无法做任何事情(它是遗留系统)
TABLE_A
---------------------------
| ID | TYPE_ID | Name |
|-------------------------|
| 1 | 1 | Name 1 |
| 2 | 2 | Name 2 |
| 3 | 1 | Name 3 |
| 4 | 1 | Name 4 |
| 5 | 3 | Name 5 |
|-------------------------|
TABLE_B
----------------------
| ID | TYPE_NAME |
|--------------------|
| 1 | Type 1 |
| 2 | Type …Run Code Online (Sandbox Code Playgroud) 我有以下查询,但没有给出预期的结果:
SELECT "invoice"."ITEMNO",
"invoice"."Outgoing",
"storeage"."incoming"
FROM "MVXJDTAP"."MVXJDTA"."invoice"
INNER JOIN "MVXJDTAP"."MVXJDTA"."storeage "
ON "invoice"."ITEMNO" = "storeage"."itemno"
ORDER BY"storeage"."itemno"
Tables:
invoice
itemno Outgoing
ZOMV3-94 4
ZOMV3-94 7
storeage
itemno incoming
ZOMV3-94 3
ZOMV3-94 1
ZOMV3-94 60
ZOMV3-94 5
Run Code Online (Sandbox Code Playgroud)
查询给出了结果:
itemno outgoing incoming
ZOMV3-94 4 3
ZOMV3-94 4 1
ZOMV3-94 4 60
ZOMV3-94 4 5
ZOMV3-94 7 3
ZOMV3-94 7 1
ZOMV3-94 7 60
ZOMV3-94 7 5
Run Code Online (Sandbox Code Playgroud)
但我希望得到以下真实结果:
ZOMV3-94 4 NULL OR 0
ZOMV3-94 7 NULL OR 0
ZOMV3-94 NULL OR 0 3 …Run Code Online (Sandbox Code Playgroud) 假设我有两个表,可能有也可能没有关系.例如,书籍和标签.所以,假设我想选择没有"Sci-Fi"标签的书籍,我会写这样的东西:
SELECT
*
FROM
books
LEFT OUTER JOIN
tags ON books.id = tags.taggable_id
WHERE
tags.name NOT IN ('Sci-Fi')
Run Code Online (Sandbox Code Playgroud)
我没想到这也会排除没有标签的书籍.我试过这个:
WHERE
tags.name IN (NULL, 'Novel'...)
Run Code Online (Sandbox Code Playgroud)
最后得到了这个,我很确定不是最好的方法:
WHERE
tags.name NOT IN ('Sci-Fi') OR tags.id IS NULL
Run Code Online (Sandbox Code Playgroud)
问题是为什么,还有另一种方式吗?
PS不会问为什么标签是这样创建的,它只是为了举例而且这是我设法挤出自己的最佳类比:)
我在一对多地图,库存和批次上有两个表,在批次表上我有一个名为deleted的布尔字段,所以我没有真正删除行,但更改了要忽略的标志而不计入查询,我正在尝试将一个查询合并到一个视图中,但是如果我添加了删除的字段,那么查询的RIGHT JOIN就像INNER JOIN一样,我希望下面的示例中的所有FROM库存工作正常,但不排除任何已删除的记录在桌子上jap.lots.
CREATE VIEW view_inventory_lots AS
SELECT count(lots.*) AS lots,
sum(lots.qty_available) AS available,
sum(lots.qty_received) AS received,
sum(lots.qty_on_hand) AS onhand,
sum(lots.qty_allocated) AS allocated,
inventories.*
FROM jap.lots RIGHT JOIN jap.inventories
ON jap.lots.inventory_id = jap.inventories.inventory_id
GROUP BY inventories.inventory_id;
Run Code Online (Sandbox Code Playgroud)
如果我尝试修改此视图以使用以下查询添加lot.deleted字段进行过滤:
SELECT count(lots.*) AS lots,
sum(lots.qty_available) AS available,
sum(lots.qty_received) AS received,
sum(lots.qty_on_hand) AS onhand,
sum(lots.qty_allocated) AS allocated,
lots.deleted,
inventories.*
FROM jap.lots RIGHT JOIN jap.inventories
ON jap.lots.inventory_id = jap.inventories.inventory_id
WHERE lots.deleted = false
GROUP BY inventories.inventory_id, lots.deleted;
Run Code Online (Sandbox Code Playgroud)
结果只是在批次表上有记录的库存行,因此忽略了RIGHT JOIN的用途,表现为INNER JOIN
有任何想法吗?提前致谢
我正在尝试外连接两个表,并且当"全名"列中显示空值时,将其替换为"无人".
外连接工作正常,问题是,null值仍为null,而不是'No one'.
以下是我的代码.
SELECT
NVL(to_char(e.FIRST_NAME||' '||e.LAST_NAME),'No One') "Full Name",
d.DEPARTMENT_NAME
FROM EMPLOYEES e,DEPARTMENTS d
WHERE e.DEPARTMENT_ID(+)=d.DEPARTMENT_ID;
Run Code Online (Sandbox Code Playgroud)
谢谢你看看!
outer-join ×10
sql ×5
sql-server ×3
join ×2
mysql ×2
postgresql ×2
inner-join ×1
left-join ×1
nhibernate ×1
nvl ×1
oracle ×1
performance ×1
python ×1
self-join ×1
sqlalchemy ×1
t-sql ×1