gpt4 book ai didi

SQL返回重复结果

转载 作者:行者123 更新时间:2023-12-04 04:47:24 26 4
gpt4 key购买 nike

为什么以下SQL查询返回重复的结果?我只想在我的结果集中返回3行。我猜我的加入不正确。约束应从查询联接中得到解释。如果您需要其他信息,请询问。

SELECT 
[addresstype].name As [Type],
[address].city As [City], address.statecode As [State],
[address].postalcode As [Zip],
[address].addressid As [Id]
FROM
[address]
LEFT OUTER JOIN [contact_address] ON [address].addressid = [contact_address].addressid
LEFT OUTER JOIN [addresstype] ON [addresstype].addresstypeid = [contact_address].addresstypeid
LEFT OUTER JOIN [clientcontact] ON dbo.contact_address.contactid = [clientcontact].contactid
WHERE
[contact_address].contactid = 12538
ORDER BY
[address].name, [address].statecode, [address].city

结果:

======================

更多信息

看来我有多个客户。我具有此联接的原因不是针对此查询,而是针对依赖此查询的另一个查询。它是在.NET代码的自定义规则引擎中构建的。另一个查询需要此clientcontact联接,因为有一个根据UNION查询建立的临时表。如果是这样的话,我真的不需要带有该联接的表(clientcontact)。我得到多行,因为在clientcontact表中有多个clientid。换句话说,这种联系方式对所有这些客户都有效。但是,我想放一个WHERE子句,这样我得到3行,但是我不能弄乱JOINS。根据我上面的解释,这些内容是共享的。如何才能做到这一点? ...原谅我的正确加入..不应该改变任何事情。不要让那让您感到困惑。 :-)

新查询显示以下内容:
SELECT 
dbo.clientcontact.clientcontactid ,
dbo.clientcontact.clientid ,
dbo.clientcontact.contactid
--[addresstype].name As [Type],
--[address].city As [City], address.statecode As [State],
--[address].postalcode As [Zip],
--[address].addressid As [Id]
FROM
[address]
LEFT OUTER JOIN [contact_address] ON [address].addressid = [contact_address].addressid
LEFT OUTER JOIN [addresstype] ON [addresstype].addresstypeid = [contact_address].addresstypeid
right JOIN [clientcontact] ON dbo.contact_address.contactid = [clientcontact].contactid
WHERE
[contact_address].contactid = 12538
ORDER BY
[address].name, [address].statecode, [address].city

=================

更多更新

对于为什么我无法删除clientcontact联接,有些人感到困惑。这是因为.NET规则引擎中的另一个查询正在使用相同的查询。请参阅下面的UNION查询的第二个查询。如果绝对没有办法通过保持连接来从中获得3行,那么我猜就是答案。然后,我需要将两者分开。
SELECT 
client_addressexternal.address_table_type As [Address Record Type],
addresstype.name As [Type],
CASE WHEN client_addressexternal.address_table_type = 'CLIENT Address' THEN '<a href="/ClientServices/ManageClients/ClientDetails/ClientAddresses.aspx?Id=' + CONVERT(VARCHAR,client_addressexternal.addressid) + '&ClientId=' + CONVERT(VARCHAR,client_addressexternal.client_id) + '&SourceClientId=14103">' + address.name + '</a>' + '<br /><b>Client Name:</b> ' + client_addressexternal.client_full_name ELSE client_addressexternal.contact_full_name END As [Address Name],
dbo.limssubstring(dbo.LIMSNullString(address1) + '<br />' + dbo.LIMSNullString(address2), 84) As [Address],
address.city As [City], address.statecode As [State],
address.postalcode As [Zip],
CASE client.clientid WHEN 14103 THEN '' ELSE client.name END As [From Parent Client],
address.addressid As [Id]
FROM
address
JOIN (

SELECT client_address.clientid, client_address.addressid, client_address.addresstypeid, depth, 'CLIENT Address' AS 'address_table_type', '' as 'contact_full_name', client.name as 'client_full_name', client_address.clientid as 'client_id', '' as 'contact_id'
FROM dbo.fnClientRelatives(14103, 0, 1, 0) relatives
inner join client_address on client_address.clientid = relatives.clientid
LEFT OUTER JOIN client ON relatives.clientid = dbo.client.clientid

UNION

SELECT clientcontact.clientid, contact_address.addressid, contact_address.addresstypeid, 999 [depth], 'CONTACT Address' AS 'address_table_type', address.name + '<br /><b>Contact Name:</b> ' + LTRIM(RTRIM(ISNULL(contact.firstname, '') + ISNULL(' ' + contact.middleinitial + ' ', ' ') + ISNULL(contact.lastname, ''))), '' as 'client_full_name', clientcontact.clientid as 'client_id', clientcontact.contactid as 'contact_id'
from clientcontact
inner join contact_address ON contact_address.contactid=clientcontact.contactid and clientcontact.clientid=14103
LEFT OUTER JOIN [contact] ON [clientcontact].contactid = [contact].contactid
LEFT OUTER JOIN [address] ON contact_address.addressid = address.addressid

) AS client_addressexternal ON client_addressexternal.addressid = address.addressid
JOIN client ON client.clientid = client_addressexternal.clientid
JOIN addresstype on addresstype.addresstypeid = client_addressexternal.addresstypeid
ORDER BY
depth,address.statecode, address.city, address.name

如果您对此 super 感兴趣,请使用以下函数:
GO
/****** Object: UserDefinedFunction [dbo].[fnClientRelatives] Script Date: 07/29/2011 12:48:24 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
--your basic recursive tree searcher.
--childrennotparents = 1 means you'll get children. = 0 means you'll get parents
--@recursive = 1 means it finds all children, grandchildren, etc... or whatever
-- The depth is the base level to start incrementing each level, if set to zero, the @clientid will also be part of the results
ALTER FUNCTION [dbo].[fnClientRelatives]
(
@clientId INT,
@childrenNotParents BIT,
@recursive bit,
@depth int
)
RETURNS @clientids TABLE (clientid INT primary key clustered, depth int)
AS
begin

-- Add the parent client id if the depth is zero
if @depth = 0
begin
INSERT INTO @clientids VALUES (@clientid, @depth)
end
set @depth = @depth + 1

IF @childrenNotParents = 1
begin
DECLARE clientids CURSOR FOR
SELECT clientid
FROM client
where parentclientid = @clientId
END--/if childrennotparents
ELSE--if not childrennotparents
BEGIN
DECLARE clientids CURSOR FOR
SELECT parentclientid
FROM client
where clientid = @clientid
END--/if not childrennotparents

OPEN clientids
DECLARE @nextClientID INT
FETCH clientids INTO @nextClientID
--@nextClientID may be null if we're loading parents, and the
--current client has null for a parent id.
WHILE @@FETCH_STATUS = 0 AND @nextClientID IS NOT NULL
BEGIN
INSERT INTO @clientids
VALUES (@nextclientid, @depth)

IF @recursive = 1
BEGIN
INSERT INTO @clientids
SELECT * FROM dbo.fnClientRelatives(@nextclientid, @childrenNotParents, @recursive, @depth)
END--IF @recursive = 1
FETCH clientids INTO @nextclientid
END--WHILE @@FETCH_STATUS = 0

CLOSE clientids
DEALLOCATE clientids

RETURN
END--/IssueRelatives

地址的数据库图:

最佳答案

理解为什么从查询中获得多个重复行是学习SQL的一项关键技能-这是我建议使用SELECT *而不是使用列列表的少数几个地方之一。

一旦查看了整个(宽)结果集,就可以希望确定整个结果集包含差异的位置(即使仅包含5列的投影结果集看起来是相同的)。仅通过检查这些差异,您就可以确定如何更新原始查询:-通过将条件添加到WHERE子句,将条件添加到ONJOIN子句之一,或引入可以减少结果集的新JOIN

关于SQL返回重复结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876683/

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