[英]SQL Query Distinct Inner Join Issue
以下SQL INNER JOIN語句出現問題。 我可能在語法上缺少一些東西:
SELECT * from
(SELECT DISTINCT Name from Table.Names WHERE Haircolor='Red') uniquename
INNER JOIN
(SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name;
我想要所有具有“紅色”發色的名稱,但是我不需要任何重復的名稱。
NAME HAIRCOLOR ADDRESS PHONE EMAIL
----- --------- ------- ----- -----
Joe Red 123 Street 20768422 blah@example.com
Joe Red 828 Street 703435422 blah4@example.com
Joe Red 165 Street 10768422 blah3@example.com
Jamie Blond 4655 Street 10568888 blah3@example.com
John Brown 941 Street 40768422 blah5@example.com
Josephine Red 634 Street 43444343 blah2@example.com
Josephine Red 394 Street 43414343 blah7@example.com
查詢應返回:
NAME HAIRCOLOR ADDRESS PHONE EMAIL
----- --------- ------- ----- -----
Joe Red 123 Street 20768422 blah@example.com
Josephine Red 634 Street 43444343 blah2@example.com
也許涉及GROUP BY?
可能是:
select * from
(SELECT DISTINCT Name from Names WHERE Haircolor='Red') uniquenames
INNER JOIN
(SELECT * FROM Names) allnames
ON uniquenames.Name = allnames.Name
-這取決於您實際想要看到的內容。
更新:SQLFiddle 此處為原始答案。
但是,更好的答案(如果使用MySQL)可能是:
select * from Names WHERE Haircolor='Red' group by Name
(請注意,為每個與頭發顏色匹配的名稱返回的特定行本質上是隨機的。)
SQLFiddle 在這里 。
進一步更新:對於SQLServer,請嘗試:
with cte as
(select n.*, row_number() over (partition by name order by address) r
from Names n WHERE Haircolor='Red')
select NAME, HAIRCOLOR, ADDRESS, PHONE, EMAIL
from cte where r=1
-這將返回每個名稱的第一行(按地址,按字母順序)-SQLFiddle here 。
這是ROW_NUMBER
查詢的示例。 我目前無法測試,因此可能需要解決一些錯誤。 但是,為了讓您有一個大致的了解,它從這樣的查詢開始:
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
這為每個紅發提供了一行,並增加了列rn
,該列給出了具有相同name
每組行內的順序號。
然后,要從每個組中獲取第一個,只需添加一個外部查詢以從第一個查詢中選擇rn=1
。
select * from (
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
)
where rn=1
SELECT * FROM names WHERE haircolor = 'red' GROUP BY name ORDER BY email ASC/DESC
從原始帖子中,我看到您似乎正在將一張桌子連接到自身上,我根本看不到您為什么這樣做
根據您的加入,有一些評論/答案,我認為這可能會使您感到困惑。 您的查詢過於復雜。
如果您碰巧有兩個表,客戶和客戶功能/服務,那么我可以理解為什么您需要加入。 但是對於單個表,您就不需要它。
SELECT DISTINCT name, haircolor, address, phone, email FROM names WHERE haircolor = 'red'
如果返回結果無關緊要,那么這應該做您所需要的。 每個返回的行都應該有一個不同的“名稱”,因此您應該只返回兩行,我沒有測試過,但是可以嘗試一下。
基於OP的注釋的UPDATE :如果您希望該名稱僅出現一次,則需要在其他字段上有一個聚集子句,並按名稱分組。
SELECT Name, MAX(Address), MAX(PhoneNumber)--, MAX(YourDesiredColumnHere)
FROM Table.Names
WHERE Name IN (
SELECT Name
FROM Table.Names
WHERE Haircolor = 'RED')
GROUP BY
Name
除了這一點
Table.Names
看起來錯了,為什么你不能這樣做:
SELECT * from Table.Names WHERE Haircolor='Red'
我想念什么嗎?
您在OP中的查詢是一種非常round回的說法
Select * From Names Where HairColor = 'Red'
將distinct子查詢連接回原始表基本上可以使distinct關鍵字無效。 您能否提供有關所需內容的更多信息? 一個例子是最好的。
兄弟,請嘗試刪除您的大括號,希望下面的查詢能夠解決您的查詢
SELECT DISTINCT Name from Table.Names
INNER JOIN (SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name
WHERE Haircolor='Red
如果您不在乎想要的願望行,我會做類似的事情。
SELECT tblName.*
FROM Table.Names as tblName
INNER JOIN ( SELECT Name ,HairColor, MIN(Email)
FROM Table.Names
WHERE Haircolor='Red'
GROUP BY Name ,HairColor) as tmp ON ( tmp.Email = tblName.Email)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.