如何解决在不使用联接的情况下获取SQL中的孙记录
我有三个表:
- ParentAccount
- 单位
- 发票
ParentAccount记录可以具有多个单位(即,单位是ParentAccount的子记录)。然后,每个单位记录可以具有多个发票(即,发票是单位的子记录)。
我想编写一个SQL查询,该查询将返回与特定PersonAccount的所有单位相关联的所有发票。例如。莎拉·史密斯(Sarah Smith)是一个PersonAccount。莎拉拥有2个单位。每个单位都有2张发票。我希望能够退回与Sarah拥有的单位相关的所有发票(因此,在我刚才给出的示例中,这4张发票)。
下面的SQL语句可以很好地实现此目的,但是我使用的平台不允许使用“ Join”。有没有一种方法可以在嵌套查询的下面以另一种方式编写代码?谢谢。
SELECT invoices.invoiceNumber
FROM PersonAccount
INNER JOIN units ON units.PersonID = PersonAccount.PersonID
INNER JOIN invoices ON invoices.unitsId = units.unitsId;
解决方法
您似乎想要:
import numpy as np
import cv2
from colorthief import ColorThief
import os,os.path
import time
t0 = time.clock()
current_path = "/Color_detection/"
folder = os.path.join(current_path,'toprocess')
choose_write_folder = os.path.join(current_path,'processed')
edgeDetector = cv2.ximgproc.createStructuredEdgeDetection("model.yml")
count_file = 1
def filterOutSaltPepperNoise(edgeImg):
# Get rid of salt & pepper noise.
count = 0
lastMedian = edgeImg
median = cv2.medianBlur(edgeImg,5)
while not np.array_equal(lastMedian,median):
# get those pixels that gets zeroed out
zeroed = np.invert(np.logical_and(median,edgeImg))
edgeImg[zeroed] = 0
count = count + 1
if count > 70:
break
lastMedian = median
median = cv2.medianBlur(edgeImg,5)
def findSignificantContour(edgeImg):
image,contours,hierarchy = cv2.findContours(
edgeImg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE
)
# Find level 1 contours
level1Meta = []
for contourIndex,tupl in enumerate(hierarchy[0]):
# Each array is in format (Next,Prev,First child,Parent)
# Filter the ones without parent
if tupl[3] == -1:
tupl = np.insert(tupl.copy(),[contourIndex])
level1Meta.append(tupl)
# From among them,find the contours with large surface area.
contoursWithArea = []
for tupl in level1Meta:
contourIndex = tupl[0]
contour = contours[contourIndex]
area = cv2.contourArea(contour)
contoursWithArea.append([contour,area,contourIndex])
contoursWithArea.sort(key=lambda meta: meta[1],reverse=True)
largestContour = contoursWithArea[0][0]
return largestContour
def remove_background(im):
blurred = cv2.GaussianBlur(im,(5,5),0)
blurred_float = blurred.astype(np.float32) / 255.0
edges = edgeDetector.detectEdges(blurred_float) * 255.0
#cv2.imwrite('edge-raw.jpg',edges)
edges_8u = np.asarray(edges,np.uint8)
filterOutSaltPepperNoise(edges_8u)
#cv2.imwrite('edge.jpg',edges_8u)
contour = findSignificantContour(edges_8u)
# Draw the contour on the original image
contourImg = np.copy(im)
cv2.drawContours(contourImg,[contour],(0,255,0),2,cv2.LINE_AA,maxLevel=1)
#cv2.imwrite('contour.jpg',contourImg)
mask = np.zeros_like(edges_8u)
cv2.fillPoly(mask,255)
# calculate sure foreground area by dilating the mask
mapFg = cv2.erode(mask,np.ones((5,np.uint8),iterations=10)
# mark inital mask as "probably background"
# and mapFg as sure foreground
trimap = np.copy(mask)
trimap[mask == 0] = cv2.GC_BGD
trimap[mask == 255] = cv2.GC_PR_BGD
trimap[mapFg == 255] = cv2.GC_FGD
# visualize trimap
trimap_print = np.copy(trimap)
trimap_print[trimap_print == cv2.GC_PR_BGD] = 128
trimap_print[trimap_print == cv2.GC_FGD] = 255
#cv2.imwrite('trimap.png',trimap_print)
# run grabcut
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,np.float64)
rect = (0,mask.shape[0] - 1,mask.shape[1] - 1)
cv2.grabCut(src,trimap,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_MASK)
# create mask again
mask2 = np.where(
(trimap == cv2.GC_FGD) | (trimap == cv2.GC_PR_FGD),0
).astype('uint8')
#cv2.imwrite('mask2.jpg',mask2)
contour2 = findSignificantContour(mask2)
mask3 = np.zeros_like(mask2)
cv2.fillPoly(mask3,[contour2],255)
# blended alpha cut-out
mask3 = np.repeat(mask3[:,:,np.newaxis],3,axis=2)
mask4 = cv2.GaussianBlur(mask3,(3,3),0)
alpha = mask4.astype(float) * 1.1 # making blend stronger
alpha[mask3 > 0] = 255
alpha[alpha > 255] = 255
alpha = alpha.astype(float)
foreground = np.copy(im).astype(float)
foreground[mask4 == 0] = 0
background = np.ones_like(foreground,dtype=float) * 255
#cv2.imwrite('foreground.png',foreground)
#cv2.imwrite('background.png',background)
#cv2.imwrite('alpha.png',alpha)
# Normalize the alpha mask to keep intensity between 0 and 1
alpha = alpha / 255.0
# Multiply the foreground with the alpha matte
foreground = cv2.multiply(alpha,foreground)
# Multiply the background with ( 1 - alpha )
background = cv2.multiply(1.0 - alpha,background)
# Add the masked foreground and background.
return cv2.add(foreground,background)
for filename in os.listdir(folder):
img = cv2.imread((os.path.join(folder,filename)))
#src = cv2.imread(filename,1)
src = cv2.resize(img,(80,80),cv2.INTER_AREA)
cutout = remove_background(src)
image_name_to_write = (os.path.join(choose_write_folder,f'image{count_file}.jpg'))
# image file is written using cv2.imwrite function
write_images = cv2.imwrite(image_name_to_write,cutout)
count_file = count_file + 1
# get the dominant color
new_image = cv2.imread(image_name_to_write)
color_thief = ColorThief(image_name_to_write)
dominant_color = color_thief.get_color(quality=5)
dict_color_value = {"Black": [{"upper": [75,75,80],"lower": [0,0],"label":[0,0]}],#"Black in light": [{"upper": [115,115,120],"lower": [90,90,90],"White": [{"upper": [255,255],"lower": [235,230,225],"label":[255,255]}],"Red": [{"upper": [255,40,40],"lower": [161,"Brown": [{"upper": [145,100,"lower": [70,20,"label":[42,42,165]}],"Dark Teal": [{"upper": [60,145,145],128,128]}],"Teal": [{"upper": [235,235,230],"lower": [125,185,185],"label": [155,215,215]}],"Dark Gray": [{"upper": [125,125,125],"lower": [65,65,70],"label":[128,"Light Gray": [{"upper": [245,245,240],"Gray": [{"upper": [255,"lower": [205,205,200],"Dark Red": [{"upper": [255,195],"lower": [185,"Red Wine": [{"upper": [255,135],"lower": [165,85],"Red Maroon": [{"upper": [95,95,65],"lower": [45,45,35],"Green": [{"upper": [95,105],165,#"Green": [{"upper": [105,55],"Dark Green": [{"upper": [95,155,80,25],"Light Green": [{"upper": [255,235],"lower": [230,215],"Orange": [{"upper": [255,"lower": [220,"Light Orange": [{"upper": [245,210],"lower": [200,200,"Yellow": [{"upper": [255,100],"lower": [225,"Bold Yellow": [{"upper": [95,60,45],"Blue": [{"upper": [85,"Coban Blue": [{"upper": [75,175],25,"Velocity Blue": [{"upper": [215,225,"lower": [140,"Royal Blue": [{"upper": [25,35,"Electric Blue": [{"upper": [55,"Sky Blue": [{"upper": [155,"lower": [105,190],"Dark Blue": [{"upper": [25,115],"Police Strobe Blue": [{"upper": [55,195,"Ocean Blue": [{"upper": [35,175,"Light Purple": [{"upper": [155,205],55,155]}],"Purple": [{"upper": [195,"lower": [135,10,225]}],"Dark Purple": [{"upper": [135,155],85]}],"Royal Purple": [{"upper": [234,226]}],"Pink": [{"upper": [255,"lower": [195,100]}],"Light Pink": [{"upper": [255,190,125]}],}
image_hsv = cv2.cvtColor(new_image,cv2.COLOR_BGR2HSV)
i = 0
dom_color = ["" for x in range(2)]
for color,list_values in dict_color_value.items():
mask0 = np.zeros(image_hsv.shape[:2])
for values in list_values:
hsv_upper = np.array(values["upper"])
hsv_lower = np.array(values["lower"])
#print(hsv_lower,hsv_upper,image_hsv.shape,mask.shape)
color_mask = cv2.inRange(image_hsv,hsv_lower,hsv_upper)
#print(dominant_color)
if i < 2:
if dominant_color[0] <= hsv_upper[0] and dominant_color[0] >= hsv_lower[0] and dominant_color[1] <= hsv_upper[1] and dominant_color[1] >= hsv_lower[1] and dominant_color[2] <= hsv_upper[2] and dominant_color[2] >= hsv_lower[2]:
dom_color[i] = color
i = i + 1
print(dominant_color)
if i == 1:
print(f"Image {filename} has dominant color is {dom_color[0]}")
else:
print(f"Image {filename} has 2 possible dominant colors are {dom_color}")
t1 = time.clock() - t0
print(t1-t0)
,
Salesforce SOQL具有“联接”,但是您将它们写成更面向对象的方式。您可以使用点使关系“向上”。像这样
SELECT Id,Name
FROM Invoice__c
WHERE Unit__r.Account.Name = 'Sarah Smith'
应该让您开始。 这是假设
-
Invoice__c
是一个自定义对象(像Account
这样的标准对象没有__c
) - 它有一个名为
Unit__c
的查找(外键)(因此,很可能“关系名称”(联接的表别名)被管理员选择为Unit__r
。可以是Parent__r
例如,您必须检查)
如果我了解问题所在,请参考以下嵌套查询示例。
SELECT invoices.invoiceNumber
FROM PersonAccount
WHERE PersonAccount.invoiceNumber in (SELECT invoices.invoiceNumber
FROM PersonAccount INNER JOIN units ON units.PersonID = PersonAccount.PersonID
INNER JOIN invoices ON invoices.unitsId = units.unitsId)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。