标签: join

使用 OR 连接多列

我有一个 100 万条记录的表来加入另一个有 100000 条记录的表。但是,表 1 中有 5 个潜在的键(假设帐号、电子邮件地址、会员编号、备用电子邮件和 ID 号)和表 2 中的 60 列 () 必须用作连接键。所以,我的代码如下所示:

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 OR 
t1.col1 = t2.col2 OR
t1.col1 = t2.col3 OR
...
t1.col5 = t2.col1 
Run Code Online (Sandbox Code Playgroud)

等等。5 和 60 的组合是巨大的,它会杀死服务器。这听起来也不合逻辑。我正在考虑将 60 列作为行并增加记录数以减少列数。但是,尚不确定这是否是最佳解决方案。任何不杀死服务器的解决方案都受到高度赞赏。

注意:请注意,tb1 中的每一列都将与 tbl2 中的 10-15 列进行匹配。例如,col1包含“帐号”的列与包含col1-10所有潜在“帐号”的列相连。col1绝不会加入电子邮件地址或其他一些列。

join sql-server

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

NOT IN(与连接一起)查询

我有两张桌子: PartOrderLine

Part (PartNum PK, PartDesc, Price)

OrderLine (OrderNum PK, PartNum PK, QtyOrdered)
Run Code Online (Sandbox Code Playgroud)

我想找出订购的零件。我想我有一个好主意,但我可能遗漏了一些东西;我认为最有可能在语法上。请检查:

select Part.PartNum
    ,OrderLine.OrderNum
from OrderLine
inner join Part on OrderLine.PartNum = Part.PartNum
where PartNum not in (
        select distinct (OrderNum)
        from OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

这样对吗?

join sql-server t-sql sql-server-2014

4
推荐指数
1
解决办法
96
查看次数

外部自联接过滤器与子查询

我有一张表存储有关门票的信息。售票时有一个记录,使用票时有另一个记录。有一个名为 TransType 的列,它被设置为“已售出”或“已使用”以标记它是哪一个。表中还有其他列,其中一些列在销售时包含值,但在使用时不包含值,反之亦然。该表实际上是数据仓库风格的事实表。

在其他事情中,我正在计算销售和使用之间的时间差,因此我将表格加入到自己的表格中,以便为每张票获取一条记录,以便能够在同一记录中计算两个事件的时间戳。

我需要包括所有售出的门票,所以外连接应该可以解决这个问题。

首先我运行了这个查询

select x.* 
from factI as x
left join factI as y on x.tickedId = y.tickedId
where x.TransType = 'sold'
and y.TransType = 'used'
Run Code Online (Sandbox Code Playgroud)

当我运行它时,过滤器 x.TransType = 'sold' 不起作用,并且查询实际上返回所有记录的结果,无论 TransType 是什么。如果我使用内连接,这会起作用,但显然不会返回尚未使用的票证。

所以我将查询更改为这个给我正确结果的查询。

select * from (
   select * from factI where TransType = 'sold'
) as x
left join (
   select * from factI where TransType = 'used'
) as y on x.ticketId = y.ticketId
Run Code Online (Sandbox Code Playgroud)

当我使用外部(左)连接时,为什么第一个查询中的 where 子句没有正确过滤掉?

join sql-server subquery sql-server-2012

4
推荐指数
1
解决办法
2139
查看次数

为什么我的执行计划(有时)包括左连接?

我发现了一个类似的问题,我知道为了查询表格

SELECT COUNT(1)
FROM foo f
LEFT OUTER JOIN bar b ON f.Value = b.Value AND f.Value = b.Value2
Run Code Online (Sandbox Code Playgroud)

要在不接触的情况下执行bar,需要在有问题的两列上有一个唯一索引。

事实上,到目前为止,这有效,表被定义为:

CREATE TABLE [dbo].[Foo](
    [Value] [varchar](255) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Bar](
    [Value] [varchar](1024) NULL,
    [Value2] [varchar](1024) NULL
)

CREATE UNIQUE CLUSTERED INDEX [IX] ON [dbo].[Bar]
(
    [Value] ASC,
    [Value2] ASC
)
Run Code Online (Sandbox Code Playgroud)

查询计划没有触及bar,太好了。

在我探索为什么这在我编写的某些应用程序的实际查询中不起作用时,我将那里的查询简化为以下简单的测试,并且查询计划器无法将其从桌子上移开bar

WITH numbers AS (
    SELECT 1 AS i
    UNION ALL SELECT i + 1
    FROM numbers …
Run Code Online (Sandbox Code Playgroud)

join sql-server execution-plan sql-server-2014

4
推荐指数
1
解决办法
576
查看次数

连接共享一个公共列的三个表

我有三个包含以下列的表:

Table 1: Hostname, OS, Confidence    
Table 2: Hostname, Manufacturer, Model, Serial_Number, Architecture, Memory    
Table 3: Hostname, MAC, Interface
Run Code Online (Sandbox Code Playgroud)

应该是这样,但我还不能确定,如果一个主机名存在于一个表中,那么它就会出现在所有三个表中。我不确定为什么这些数据被分成三个不同的表,但目前是这样,这就是我提出问题的原因。

如何将这三张表合二为一?我有以下将结合其中两个的内容,但我不确定如何修改它以包含 Table3:

SELECT
    COALESCE(Table1.Hostname, Table2.Hostname) AS Hostname,
    Manufacturer,
    Model,
    Serial_Number,
    Architecture,
    Memory
FROM Table1
FULL OUTER JOIN Table2
ON Table1.Hostname = Table2.Hostname
Run Code Online (Sandbox Code Playgroud)

join sql-server

4
推荐指数
1
解决办法
1万
查看次数

将 JOIN 添加到 GROUP_CONCAT()

我有一个主要是静态目标的表格,另一个用于跟踪用户完成这些目标的情况。他们可以将完成与在另一个表格和/或文本注释中输入的一个或多个记录相关联。我想将所有这些一起格式化为一个条目以显示在表格中(即每个目标一行)。

下面是一个Completion可能看起来像的示例:

ID    userID    objectiveID    recordID    text
1     4         8              500         NULL
2     4         8              NULL        "Lorem ipsum..."
3     4         8              750         NULL
Run Code Online (Sandbox Code Playgroud)

我已经走了这么远:

SELECT objectiveID,
   GROUP_CONCAT(recordID SEPARATOR ',') AS records,
   GROUP_CONCAT(text SEPARATOR ',') AS text
FROM Completion AS c
GROUP BY objectiveID;
Run Code Online (Sandbox Code Playgroud)

返回:

objectiveID    records    text
8              "500,750"  "Lorem ipsum..."
Run Code Online (Sandbox Code Playgroud)

然而,我实际上想要显示的是被引用的代码的属性recordID......假设这是Record表:

ID    userID    codeID
500   4         1111
750   4         2222
Run Code Online (Sandbox Code Playgroud)

这是Code表:

ID    description
1111  dolor
2222  sit amet
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

objectiveID    records …
Run Code Online (Sandbox Code Playgroud)

mysql join group-concatenation

4
推荐指数
1
解决办法
1万
查看次数

如何使用连接加速查询

我有几张桌子需要加入。我有一个员工表(约 40 万行)、一个公司表(约 1000 万行)和一个存储某人工作地点的员工公司表。

基本上,我需要让所有符合某些条件的员工(他们在拥有网站的公司工作,位于某个国家/地区等)。我进行了查询以获取此信息,但花费的时间太长。我需要加快速度。

SELECT  DISTINCT "employees".* 
FROM "employees" 
INNER JOIN "employee_companies" ON "employee_companies"."employee_id" = "employees"."id" 
INNER JOIN "companies" ON "companies"."id" = "employee_companies"."company_id" 
WHERE (employee_companies.employee_id IS NOT NULL)
AND (companies.website IS NOT NULL) 
AND (employees.country = 'Uruguay') 
ORDER BY employees.connections DESC
Run Code Online (Sandbox Code Playgroud)

这是该查询的计划:

Unique  (cost=877170.24..880752.72 rows=62304 width=1064) (actual time=24023.736..26001.876 rows=73318 loops=1)
  ->  Sort  (cost=877170.24..877326.00 rows=62304 width=1064) (actual time=24023.733..24305.989 rows=77579 loops=1)
        Sort Key: employees.connections DESC, employees.id, employees.name, employees.link, employees.role, employees.area, employees.profile_picture, employees.summary, employees.current_companies, employees.previous_companies, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join query-performance

4
推荐指数
1
解决办法
1万
查看次数

加入时包含 NULL 行

如何从 table_A 中选择所有行,然后连接来自其他表的结果,但包含一个 NULL 行以显示那些没有 table_A_id 的其他表的聚合值?

WITH RECURSIVE transactions_with_children AS (
  SELECT
    table_A_id,
    other_stuff,
    1 AS depth
  FROM transactions
  WHERE transactions.parent_transaction_id IS NULL
  UNION ALL
  SELECT
    table_A_id,
    other_stuff,
    depth + 1 AS depth
  FROM transactions children
    INNER JOIN transactions_with_children parents ON children.parent_transaction_id = parents.id
)

SELECT 
  table_A.id,
  view_B.aggregate_col1, view_B.aggregate_col2,
  view_C.aggregate_col1, view_C.aggregate_col2

FROM table_A
  -- Limit table_A to only records with data from transactions_with_children, but I also need to include
  -- a null row for all transactions_with_children that don't have …
Run Code Online (Sandbox Code Playgroud)

postgresql join group-by

4
推荐指数
1
解决办法
1万
查看次数

为聚合连接多个表

如何使用 Sum 和 Count 函数连接多个表进行聚合?

我正在尝试的查询如下:

Select
  campaigns.id,
  campaigns.name,
  Count(landers.campaign_id) As landers_count,
  Sum(conversions.revenue) As total_revenue
From
  campaigns Left Join
  conversions
    On campaigns.id = conversions.campaign_id Left Join
  landers
    On campaigns.id = landers.campaign_id
Group By
  campaigns.id
Run Code Online (Sandbox Code Playgroud)

我什至尝试过外部连接,但没有运气,而且我得到的结果不准确。

我的示例表如下:

活动表:

| id | name           |
+----+----------------+
| 1  | Facebook Ads   |
| 2  | Bing Ads       |
| 3  | Direct Mailing |
| 4  | Solo Ads       |
Run Code Online (Sandbox Code Playgroud)

兰德斯表:

| id | name        | campaign_id |
+----+-------------+-------------+
| 1  | Lander …
Run Code Online (Sandbox Code Playgroud)

mysql join aggregate count sum

4
推荐指数
2
解决办法
7420
查看次数

从一组值中选择最非默认的值

鉴于以下表格:

CREATE TABLE FeeTestClient (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name VARCHAR(16))
INSERT INTO FeeTestClient (Name)
VALUES ('Test'), ('Test 2'), ('Test 3')

CREATE TABLE FeeTest (FeeId INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ClientId INT, Fee INT, Val VARCHAR(16), Val2 VARCHAR(16))
INSERT INTO FeeTest (ClientId, Fee, Val, Val2)
VALUES (1, 15, 'Default', 'Default'),
       (1, 10, 'Default', 'asdf'),
       (2, 15, 'Default', 'Default'),
       (2, 20, 'Default', 'qwer'),
       (2, 10, 'zxcv', 'asdf'),
       (3, 20, 'Default', 'Default')
Run Code Online (Sandbox Code Playgroud)

我的目标是选择所有FeeTestClient元素,并选择最不默认的费用。在默认费的规则很简单:如果Val2是 …

join sql-server sql-server-2014 coalesce

4
推荐指数
1
解决办法
102
查看次数